同一渲染队列的物体的绘制顺序
同一渲染队列的情况下,Unity根据物体网格中心点与摄像机的距离(有别于深度Z)来排序,距离越大的物体,越先绘制。
d代表网格中心与摄像机的距离,视角改变会导致两个Cube的混合顺序也改变
可以看出,单靠与摄像机的距离来判断,会出现异常。正常情况下,红色Cube应该要一直被压在蓝色Cube下面,直至视角完全翻转过来。
对于同一个物体而言,它自身的网格之间若有交叉重合,则是按照顶点顺序来绘制,即先绘制的面会被后绘制的面给覆盖:
左边4面翅膀作为单个物体,右边4个翅膀分离为4个物体
用Render Queue值排序
这种方式优先度要大于按距离排序,比较“野蛮”,但某程度上解决了混合顺序异常的问题:
蓝色Cube的绘制顺序设成3001,大于红色Cube的3000
视频中可以看出,此种方式同时带出了另外一个问题:即使视角怎么变,蓝色都是压在红色上。这种方式在视角不会发生较大翻覆的情况下(比如横版的2.5D游戏),有时能符合需求。
开启深度写入
开启深度写入会破坏半透明混合
对于半透明的物体A开启深度写入,会使覆盖他的半透明物体B失去了“半透明”效果,因为深度测试的结果是要么画要么完全不画,不会进行混合:
即使视角改变,绘制顺序也一直保持正确,但会丢失“混合”效果
如果能容忍这种丢失混合效果的情况,那么开启深度写入能算勉强解决混合顺序错乱的问题。
开启深度写入的半透明,出自《UnityShader入门精要》
在《UnityShader入门精要》里面介绍透明度混合也有类似的例子。开启深度写入会导致半透明的物体不能成为“底图”,即无法产生混合效果。顺便一提书里面是采用多Pass的形式做深度写入,而URP只支持Single Pass,详见官方给出的表格。在URP用MultiPass要用RendererFeature的形式实现,点此参考示例。
切分网格
对一些不会发生交叉的网格,用切分网格的方式来解决透明混合问题效果较佳:
右边把翅膀切成4份,绘制顺序正常
Post Views:
140