Unity-透明物体渲染方式对比汇总

透明效果一直是渲染的难题之一,由于透明物体不会遮挡在物体身后的物体,导致了深度图(Z-Buffer)技术无法使用。因此渲染管线一般都会对透明物体进行特殊处理。
● 将透明物体放在不透明物体之后进行渲染
● 透明物体渲染顺序会导致颜色叠加出现问题,(比如先红色 再 蓝色, 和 先蓝色 在红色)两种方式混合出的颜色是不同的
● 由于不能使用Z-buffer,因此透明物体渲染容易出现穿插

Z-Test,使用Z-buffer中的深度对比当前像素深度,如果深度满足条件像素就会被渲染
Z-buffer,所有shader共用的缓存。如果Z-test通过,那么像素点可以根据pass中的设置写入或者不写入Z-buffer,当然也可以始终写入(即使Z-Test不通过)
Cull,前向剔除,后向剔除,或者不提除

对于透明物体渲染时,按深度进行从后向前排序(同队列大小)。因此我们不用过度担心多个透明物体的相互遮挡关心,因为从后向前的渲染方式不会丢弃和渲染错误任何一个透明物体。
特别的Unity中当队列值>2500时将识别为半透明队列,按深度进行从后向前排序。

总结

先说结论。

直接混合确实会有模型内的先后顺序穿插,但是模型简单的话并不明显。我们甚至可以使用其他技术来减少这一区别,比如基于 相机和像素点的距离,距离越近透明度越高。这样可以解决大多数穿插问题。
对于复杂模型来说多次pass渲染是必要的(多Material渲染性能比较差)。

● 如果不需要考虑不同透明物体相互穿插,那么ZWrite Off(ZTest On,Cull Off)就能获得很好的效果。
● 如果不需要考虑透明物体背面,那么Cull Back(ZTest On,ZWrite On)就能获得很好的效果。
● 如果需要比较完善的渲染,那么需要使用双pass才能保证透明物体渲染较为正确。
● 如果需要比较完善的渲染,并且不在意开销,那么使用三Pass渲染可以让透明物体得到更为正确的渲染。

对比

变量因素:
● ZTest On,Off,
● ZWrite On,Off
● Cull back,Front,Off

1、ZTest On能保证透明物体和不透明物体间的渲染正确

ZTest Off后,会导致半透明物体直接将所有的不透明物体覆盖。。本来被不透明物体覆盖的,看不见的半透明物体都错误的显示出来了。
在这里插入图片描述

ZWrite On,Cull Off

2、ZWrite On 能保证不同透明物体间穿插渲染正确

观察ZWrite Off渲染结果,发现黄色方块被渲染到了球体的背面(实际上应该一部分穿插到内部了)。
虽然ZWrite On渲染结果很奇怪,但是黄色方块正确的被渲染到了球形内部。
在这里插入图片描述

ZTest On,Cull Off

3、Cull Back能避免部分背面的渲染异常问题(透明物体自身出现不正常穿插)

虽然避免了自身出现穿插的问题,但是却没有还原出背面的不透明效果。缺失了真实感。
在这里插入图片描述

ZTest On,ZWrite On

4、预写深度解决透明物体自身出现不正常穿插问题

确实自身不会穿插额,但是背面由于深度测试导致被剔除了。(渲染结果和背面剔除有点区别,背面剔除会带有一点瑕疵)。
在这里插入图片描述

ZTest On,ZWrite On,Cull Off

5、双pass渲染解决背面渲染问题

先渲染背面(Cull Front),然后渲染前面(Cull Back)来保证正面和背面渲染顺序,以及两面都被渲染。
问题:由于先渲染背向并且写入深度了,如果出现正向且深度较大就会被剔除。因此复杂物体自身会出现瑕疵。
在这里插入图片描述

不预写深度,ZWrite On,ZTest On,Cull Front\Back

6、三pass渲染解决双pass渲染自身瑕疵@MoYaun

最先渲染一个额外的Pass,剔除背面,ZTest On,ZWrite Off理论上可以解决——让消失的那部分补上。

这个渲染方式并没有实际参考依据,只是我个人针对双pass渲染缺陷的trick——我想到这种方式可以对其进行补齐就这样做了。

在这里插入图片描述

但是由于正向的颜色被渲染了两次,因此颜色出现叠加,因此对于出现正面背面不同颜色的渲染会出现差异,正面渲染的颜色会更亮。(但是影响不大,看上去依然正确)
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41709801/article/details/128608254