当同一个Mesh自己遮挡住自己,导致模型半透明效果显示混乱,如下图:
通过Frame Debugger看到渲染顺序如下:
产生这种情况的原因首先要搞清楚:
1.首先了解一下在场景中既有不透明物体,也有透明物体,渲染顺序是通过设置Pass的渲染队列实现不透明物体首先渲染,透明物体后渲染。不透明:"Queue" = "Geometry" 透明:"Queue" = "Transparent"
2.后面的背景跟地面渲染完后,前面的半透明物体由于Mesh相互遮挡,在同一个像素点上,如果有两个半透明点A和B,A在前,B在后,如果先渲染A,A的深度与深度缓存相比较,进行混合,但是A的深度值不会写入到深度缓冲中,所以B在渲染时也会与深度缓冲中的深度值进行比较,发现也需要混合,所以看起来B在A前面,产生混乱。
3.同一个Mesh的渲染顺序是由内部三角形的顺序决定的,所以如果相互遮挡的情况下,如果能够从后向前渲染,或者能够进行深度写入就能够解决这个问题。
半透明物体可以尝试开启两个Pass进行解决:
第一个Pass开启深度写入,不输出颜色,目的仅仅是把深度信息写入到深度缓存中
第二个Pass进行正常的透明度混合。
加了一个只渲染深度的Pass后,渲染流程如下:
这样,在不透明物体渲染完成后,深度缓存中会有深度值,颜色缓冲中会有颜色值,然后半透明物体第一个Pass进行深度写入,记录下各个像素点的深度值。第二个Pass进行颜色Draw Mesh的时候,如果两个遮挡点A、B,A在B前,如果A先渲染,A的深度值与深度缓冲中的进行比较,因为在A对应像素点上A距离摄像机最近,深度值等于深度缓冲中的,会与颜色缓冲中的颜色值进行混合。当B后渲染,与深度缓冲中深度值进行比较,发现没有深度缓冲中的值小,被舍弃,所以不会渲染,所以会呈现正确的结果。