渲染顺序
Unity排序优先级
- 相机 Depth
- RendererQueue(0~2500)
- 透明物体(UI/特效层) SortLayer
- 透明物体(UI/特效层) SortOrder
- RendererQueue(2501~5000)
相机
相机的排序一定是最高级,按照相机depth升序渲染,depth越小越先渲染;
RendererQueue 0~2500
在同一个相机之下,优先渲染不透明物体,并按照RendererQueue升序排序,RendererQueue越小越先渲染。
注意:因为有深度缓冲(ZBuffer)和深度检测存在,所以即便是后渲染的物体,如果Z值在先渲染的物体之后,图元依然会被舍弃。因此不透明物体的渲染顺序并不影响其显示顺序, Unity会自行调整其调用DrawCall的顺序。
SortLayer
在同一个相机之下,当渲染透明物体时,优先按照SortLayer进行排序,SortLayer靠前的会被优先渲染。
SortOrder
当相机、SortLayer都相同时,按照SortOrder进行排序,SortOrder低的优先被渲染。
RendererQueue 2501~5000
当相机、SortLayer、SortOrder都相同时, 按照RendererQueue进行排序, RendererQueue较低的优先渲染。
注意: 由于透明物体往往关闭了深度写入, 因此此时渲染顺序将严格按照RendererQueue进行排序。Unity在渲染透明物体时,如果RendererQueue相同,则会严格按照由远及近的顺序调用DrawCall。
Hierarchy顺序
在UI中,以上条件皆相同的情况下,会按照UI在Hierarchy面板中的顺序进行排序。
策略与优化
策略
- UI和场景物体分相机渲染,此时场景相机不考虑sortLyaer和sortOrder, UI相机不考虑不透明物体;
- 场景中的3D UI, 例如人物头顶的血条等, 可以将Canvas设置为WorldSpace, 并指定场景相机进行渲染,此时UI 将被视为一个透明物体, 渲染顺序与透明物体相同, 默认UI材质RendererQueue为3000;
- 场景中的粒子按照其材质RendererQueue排序,但是当RendererQueue>2500之后,改变SortLayer和SortOrder也将改变材质顺序, 即使不是在UI中使用。因此场景中的粒子不建议设置SortOrder和SortLayer,除非希望粒子位于渲染队列的首部或尾部;
- UI中的粒子层级与Canvas一致, 使用SortOrder和SortLayer排序即可;
- 粒子本身会进行动态合批, 即便使用了多pass的材质, 粒子依然会对每个pass进行合批;
关于UI的优化
由于UI往往按照SortOrder进行排序,因此一旦页面中使用了不同的图集或材质,一定会打断当前页面的合批。
- 同一个页面尽量使用同一个图集;
- 同一个页面使用到字体材质尽量不穿插在页面中间,而是统一放在UI靠后的位置;
- 同一个页面使用到特殊材质的话,尽量放在UI靠后的位置;