https://www.zhihu.com/question/60898307
https://www.jianshu.com/p/e953e937e210

在学习冯乐乐的《Unity Shader入门精要》时有了一个疑问:

为什么半透明模型的渲染要使用深度测试而关闭深度写入?

深度测试与混合的大概流程

Unity Shader中的透明度混合与渲染顺序

Unity Shader中的透明度混合与渲染顺序

Unity Shader中的透明度混合与渲染顺序

深度测试与深度写入是什么关系?

深度测试的意义在于舍弃片元与否。

深度写入的意义在于深度测试的基础上,要不要覆盖深度缓冲,即重新设立深度测试的标准。

因此,结论如下:

进行半透明渲染需要开启深度测试的原因是,如果半透明物体被不透明物体挡住了,那么该fragments是不需要写入到帧缓冲的,也就是说开启深度测试是为了保证不透明物体和半透明物体之间正常的遮挡关系;

而关闭深度写入也很好理解,因为开启深度写入后我们会得到这样一种错误的结果,那就是近处的半透明fragments居然会挡住远处的半透明fragments,这和我们前面说到的我们可以透过半透明物体看到物体后面的东西是矛盾的!

通过上面的讨论我们会发现半透明物体的渲染其实比不透明物体渲染复杂很多,我们在渲染半透明物体时需要遵循画家算法由远及近进行绘制,最终效果才会正确!

然而,这里又有一个问题:我们如何严格按照距离来进行远近排列呢?比如,三个相互交叉的三角形!所以,进行半透明物体渲染一般会采用一种叫做顺序无关的透明渲染技术(Order-Independent-Transparency,OIT)。

什么时候需要写入深度

https://www.jianshu.com/p/e953e937e210

相关文章: