Forum Replies Created
-
AuthorPosts
-
decayParticipant
这篇回复是回复给“食铁兽”同学的,不知为何回复到了外层
This post has received 1 vote down.decayParticipant个人理解:无论是msaa还是ssaa都需要把depth buffer和frame buffer都开成原来的n倍,而msaa和ssaa的区别在于ssaa是直接进行完整的n遍渲染,最后再把这些渲染的结果平均起来;msaa则是进行n次光栅化,但着色只进行一次,并且认为着色点仍然是像素中心,而不是四个子像素的位置,最后根据光栅化时的结果将相应的frame buffer更新到新的着色值。
写一下伪代码更清晰一些:rasterization_ssaa: for(x : xmin ~ xmax): for(y : ymin ~ ymax): for(subsample : n): if(depth_test(subsample) == success): update(depth_buffer[subsample]) sample_buffer[subsample] = shading(subsample, other_info) frame_buffer[sample] = avg(sample_buffer)
rasterization_msaa: for(x : xmin ~ xmax): for(y : ymin ~ ymax): // 着色发生在内部采样循环外面,因此只着色一次,提高了效率 pixel_color = shading(sample, other_info) for(subsample : n): if(depth_test(subsample) == success): update(depth_buffer[subsample]) sample_buffer[subsample] = pixel_color frame_buffer[sample] = avg(sample_buffer)
可以在文刀大大的回答以及learnopengl中找到类似的结论:
https://www.zhihu.com/question/20236638/answer/44821615
https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing
不过对于你可能还有个问题,就是作业2中的着色其实就是对像素进行颜色插值,所以实际上对于作业2来说,msaa和ssaa其实是差不太多的。至于你和楼主遇到的黑边,是因为你们没有开n倍的frame buffer,只要让frame buffer把每个子采样点的颜色记住就不会出问题。
我用上述思路在作业3中实现了msaa,最后附上blinn-phong着色的效果图对比图,右边是4xmsaa的,可以看到虽然还是有一些狗牙,但平滑了不少.(吐槽一下,作业3的insideTriangle函数直接把参数定义成了int,坑了我好久)decayParticipant作业5的光照模型认为反射材质不会有漫反射,纯粹靠反射来的光线着色(这些光线最终来自光源或者别的漫反射物体),在现实里也是有这种情况的,比如你在单光源的房间里把一块镜子放在背光的地方,然后如果镜子前的东西能照到光的话,你依然可以在镜子上看到很清楚的像
decayParticipant太感谢了,最早在实现多线程之前想要profile一下整个程序,优化的同时正好复习一下最近学的csapp第五章的知识,但无奈mac上用gprof和谷歌的profiler会有很多问题,与之搏斗了一天以后作罢。。按照你的发现修改了程序以后64spp渲染只需要40+秒,以前需要20分钟,尤其是我最近在微表面提高题那里疯狂踩坑,每次微调一下公式想看效果就得等上半小时左右,现在感觉写起bug来也有劲了!
另外由于我不是特别了解多线程的基本知识,只是用openmp调包实现了个简单的多线程,想问一下我把get_random_float中的random_device、梅森旋转引擎和均匀采样分布生成器都只是简单地设为static,这样在多线程上是不是会产生问题,如果是的话,这样的问题会对随机数的质量产生影响吗,因为我看最终的效果并没有什么偏差。
总之,十分感谢题主!!This post has received 1 vote up.decayParticipant我和你碰到了类似的问题,我想了很久也想不出怎么只靠深度buffer的sample list就得出一个像素点的各采样点颜色信息(因为这些采样点很属于多个深度不同的三角形),我最后的解法是把frame_buffer也给扩充,每个像素维护一个sample list
-
AuthorPosts