总结⼀下Shader开启透明渲染后的⼀些显⽰问题的解决⽅案,考虑Zwrite,Ztest,Queue这三个属性的设置问题。 ⾸先需要记住的是:
钩子程序对于不透明物体,渲染的正确顺序是从前往后;
油动多旋翼
这样才能实现正确的渲染输出。
注意:Alpha Test,Alpha to Coverage不在讨论之列。这⾥涉及到的是使⽤Alpha Blend的物体。
其次是,Unity Shader中需要注意的三个属性。
Ztest:深度测试的模式,默认为Lequal(⼩于等于)。
一体式三格化粪池Queue:渲染队列,默认为Geometry。
橡胶发泡鞋底常规来说:
对于不透明物体,默认的设置为Zwrite On,Ztest Lequal,Queue=“Geometry”。
对于半透明物体,默认的设置为Zwrite Off,Ztest Lequal,Queue=“Transparent”。
对于半透明物体,这样的设置在⼀般的情况下是没有问题的,但是在某些情况下会出现问题。
先解释⼀下相关的概念:局部镀锡
Queue:最好理解,也就是物体的在渲染队列中的顺序。太阳能浴室
Zwrite On:会开启深度缓存和深度测试,即在绘制物体表⾯上的⼀个像素时,会对像素的深度值和深度缓存中对应点的值进⾏⽐较,如果该像素的深度值⼩于或等于(Ztest Lequal)深度缓存中的值,就⽤该像素的颜⾊和深度替换掉原有的像素。
Zwrite开启之后,图形渲染将按照深度测试的结果来进⾏,不会因为渲染顺序不⼀致⽽导致前⾯的物体被后⾯的物体覆盖的问题。
半透明物体关闭了Zwrite,这时候渲染队列对于正确的显⽰就⼗分重要了。必须严格的按照后⾯的先渲染,前⾯的后渲染的顺序,否则会出现不正确的遮挡关系。
那么回到上⾯的问题,什么情况下半透明物体的默认设置表现不正确?
举个简单的例⼦,⼗字交叉的⾯⽚草渲染,通常情况下会使⽤Alpha Test的Shader。但是Alpha Test并不⽀持抗锯齿,所以有时候考虑到锯齿问题OR性能问题使⽤Alpha Blend。
如果使⽤默认设置,那么会观察到交叉的重叠效果不正确。这是因为Zwrite Off,两个⾯⽚按照先后顺序分别渲染,导致错误的重叠效果。
相反,如果开启了Zwrite,则会发现,由于开启了深度缓存测试,前⾯的透明像素成功的替换掉后⾯的不透明像素。导致前⾯⾯⽚的透明像素没有与后⾯的不透明像素混合,⽽是直接显⽰了背景像素。
对于UI之上有模型使⽤半透明材质,导致与场景进⾏半透明混合⽽不是与UI进⾏半透明混合的解决⽅案则是:使⽤脚本调整模型的Sorting Order,使其略⼤于UI组件Canvas的Sorting Order即可。
除了Shader层⾯的解决⽅式,半透明还可以通过修改顶点ID的⽅式来进⾏渲染顺序的修改,这⾥的具体⽅式不详细说明。