本文总结 Unity 中物体的渲染顺序逻辑。
1. 以摄像机为第一维度
Unity 中的渲染顺序,第一维度是由摄像机确定的,换句话说 Unity 是以摄像机为单元进行渲染,最后再根据设置的规则将多个摄像机渲染的画面合起来。
2. 划分渲染队列
在同一个摄像机下,Unity 以物体材质上的 RenderQueue 数值进行了划分,将所有物体分为两个队列
- RenderQueue < 2500,Opaque 队列,通常是不透明物体
- RenderQueue > 2500,Transparent 队列,通常是透明物体
同一个摄像机下,Unity 会先渲染 Opaque 队列中的不透明物体,然后渲染 Transparent 队列中的透明物体。
3. 不透明物体的渲染
在 Opaque 队列中的物体,根据包围盒中心距离摄像机的距离,由近到远排序,进行渲染,Opaque 队列中物体都是不透明物体,通常开启了 ZWrite,由近到远渲染可以做遮挡剔除,减少 OverDraw,Opaque 队列中的物体,可以设置 SortingLayer, SortingOrder, Shader 的 RenderQueue 等值,但不会起作用
4. 透明物体的渲染
透明物体的 Shader 通常关闭了 ZWrite,SortingLayer, SortingOrder, RenderQueue 这些值的设置会影响显示的顺序,所以透明物体的渲染顺序遵循的规则是
- 根据 SortingLayer 层的顺序进行渲染
SortingLayer 可以在 Edit->ProjectSettings->Tags&Layer 中进行设置,在代码中可以通过
render.sortingLayer = "Effect";
这样的代码进行设置
- SortingLayer 相同的情况下根据 SortingOrder 的顺序进行渲染
- SortingLayer 和 SortingOrder 都相同的情况下,根据 RenderQueue 的顺序进行渲染
- 都相同的情况下,根据包围盒中心距离摄像机的距离,由远到近进行渲染
5. UGUI 元素的渲染
UGUI 元素使用的 UI Default 材质通常 RenderQueue 为 3000,走的是透明物体的渲染,所以根据 SortingLayer -> SortingOrder -> RenderQueue 的顺序进行排序,当以上值都相同时,根据元素在 Hierarchy 视图中的顺序进行