一、渲染顺序决定因素
-
1、摄像机渲染
Unity中的渲染顺序首先是由摄像机(Camera)确定的,以摄像机为单元进行渲染,最后在根据设置将多个摄像机渲染的画面结合起来。不同物体首先按照摄像机深度进行渲染,深度高将会覆盖深度低的相机画面。 -
2、渲染队列
在同一个摄像机下,Unity以物体材质上的渲染队列(RenderQueue)数值进行了划分。- RenderQueue<2500,Opaque队列,通常是不透明物体
- RenderQueue>2500,Transparent队列,通常是透明物体
同一个摄像机下,Unity会先渲染Opaque队列中的不透明物体,然后渲染Transparent队列中的透明物体。其中的原理(https://zhuanlan.zhihu.com/p/416887453)如下:
情况一:先渲染B再渲染A
1、渲染B时
2、深度测试和写入都开启 ,所以B的数据会写入颜色缓冲区和深度缓冲区
3、渲染A时
4、关闭深度写入,进行深度测试
深度测试的结果是A离相机的具体比B更近,所以我们会将A的透明度和颜色缓冲区中B的颜色值进行混合
得到的结果正确
情况二:先渲染A再渲染B
渲染A时
因为深度写入关闭,此时只将A写入了颜色缓冲区
渲染B时
因为深度缓冲区并没有数据,所以B就会直接覆盖颜色缓冲区中的A的颜色
很显然这个结果是错误的(结果的视觉上,B在A前边)
前提:通常情况,透明shader都是会关闭深度写入的。
结论:应该先渲染不透明物体再渲染半透明物体
-
3、不透明物体的渲染
Opaque队列中物体都是不透明物体,通常是开启了ZWrite的。
由近到远渲染可以做遮挡剔除,减少了OverDraw,Opaque队列中的物体.只会由距离摄像机的深度决定,距离摄像机近的先进行渲染,开启深度写入后,相同位置深度靠后会被裁剪掉。 -
4、透明物体的渲染
透明物体的Shader通常关闭了ZWrite.- 1)SortingLayer的顺序
- 2)SortingOrder的顺序
- 3)RenderQueue的顺序
- 4)都相同的情况下,根据包围盒中心距离摄像机的距离,由远到近进行渲染
-
5、UGUI元素的渲染
UGUI元素使用的UIDefault材质通常是RenderQueue为3000,走的是透明物体的渲染。- 1)SortingLayer的顺序
- 2)SortingOrder的顺序
- 3)RenderQueue的顺序
- 4)都相同的情况下,根据元素在 Hierarchy 视图中的顺序