为什么渲染顺序很重要?
A是半透明物体,B是不透明物体,A更靠近摄像机。
如果先渲染A,那么在渲染B的时候,B就无法通过深度测试,导致B的片元被舍弃。
解决方法:先渲染完所有不透明物体后,再渲染透明物体
为什么要关闭深度写入?
A和B都是半透明物体,Unity在渲染半透明物体时,会基于物体中心对两个物体进行排序,来实现半透明物体的从后往前渲染的目的。下图A和B使用的是同一个Shader,并且没有关闭深度写入。B的中心点比A更靠近摄像机,因此渲染顺序是A->B。当A渲染后,B被A遮挡的部分没有通过深度测试而被舍弃了。
在shader中关闭深度写入后
关闭深度写入后导致的问题
关闭深度写入后,可以修复两个物体的混合问题,但当模型网格之间有互相交叉的结构时,关闭深度写入就会出现问题,如下图。这是因为关闭深度写入后,我们就无法进行像素级的深度排序,只剩下物体级别的深度排序。
我们重新开启深度写入
发现有些地方前面会完全挡住后面,而有些地方能正确混合。这是因为渲染时没有按照从后到前的渲染顺序。
解决办法:
1、按《UnityShader入门》的说法,可以分解网格,从而得到一个“质量优等”的网格,但很多情况下这往往不切实际。
2、使用两个Pass渲染模型,第一个Pass开启深度写入但不输出颜色,第二个Pass进行正常的透明度混合。
这种方法的缺点是多了一个Pass通道消耗性能,并且模型内部之间不会有任何真正的半透明效果。优点是模型仍然可以和背景混合。