对于透明物体渲染需要关闭深度写入的理解

最近复习透明物体的渲染方式,让我又浮现出了曾经的疑惑:为什么透明物体渲染要关闭深度写入?于是查了很多资料,却也没有把这个问题说的特别明白,而且很多情况下分别对比深度开和关的渲染结果,二者也没有任何显示上的差异,最后借用《Unity Shader入门精要》里面的一个例子摆弄了一下,终于把这个问题想明白了。

大部分的渲染引擎对透明物体的处理方式过程为:首先渲染所有的不透明物体,其次对所有的透明物体由远到近后排序后开启混合进行渲染(在此过程中关闭深度写入)。

我一开始的想法是这样的,既然不透明物体都经过由远到近排序了,那么即使深度写入是开启的,所有透明物渲染时也是可以通过深度测试的,实际上,对于简单场景模型来说深度写入关与否确实是没有区别。

而问题在渲染单个复杂模型的情况下就暴露出来了,一般情况下我们无法对单个模型进行像素级别的渲染排序,以下面的这个透明环状物体为例,最左侧部分的网格最先渲染,在开启深度写入的情形下,后面部分的网格就无法通过深度测试,结果被GPU剔除了。再对比一下第二张图,关闭深度写入的情形,所有的片元都会参与到混合渲染的过程中,虽然渲染结果并非完全正确,但是对比之下也是相对正确。(ps:如果想要获得理想的透明效果就要考虑双面渲染了)

对于透明物体渲染需要关闭深度写入的理解

 

对于透明物体渲染需要关闭深度写入的理解