关于Unity中物体的渲染顺序
首先这是一个牵扯很多命题。
从应用层到底层管线各种设置都会影响最后的渲染顺序。 渲染顺序又是一个非常重要知识。
1·只有正确的渲染顺序才能得到正确结果
2·渲染顺序很大程度的影响渲染性能
3·同一个物体在不同情况下会有不同的顺序
渲染器
Unity中渲染一般是通过Camera.Render渲染物体。也有其他的渲染器。例如 GPUSkin/UI等 简单列举一下渲染器本身的顺序
- GPUSkin:gpu蒙皮。
- Camera.Render:正常的Camera渲染。
- UGUI.Rendering:UGUI Overlay模式用的渲染器。
- GUI.Repaint:OnGUI中IMGUI代码渲染。
多个Camera渲染,按照Camera.Depth排序。 多个OverLay UGUI按照Canvas.SortOder排序。 多个OnGUI脚本 按照脚本的激活顺序倒序排列。
渲染管线
Camera渲染的流程就是渲染管线。 目前Unity内置了Foward 和Deferred两种主要的管线。 同时UnitySRP管线提供了可扩展的管线支持。目前官方提供LDRP/HDRP两种SRP的扩展。
前向渲染 延迟渲染 LDRP/HDRP 可编程渲染管线
在Camera渲染中。管线决定了渲染流程中有多少个渲染步骤。即渲染顺序。 以[前向渲染]举例。 Foward中包含一下几个步骤,按顺序依次执行。
- DepthTexture
- DepthNormalsTexture
- ForwardOpaque
- ImageEffectsOpaque
- Skybox
- ForwardAlpha
- ImageEffects
- HaloAndLensFlares
SortingLayer & SortingOrder
渲染顺序首先按照Layer排列。 Layer相同按照Order排序。 默认的所有物体处在Layer=Default。Order=0
RenderQueue
渲染队列
物体的渲染顺序按照Queue数字由小到大排列。
Unity中按照队列数值分为一下几个队列。
\begin{array}[b] {|c|c|} \hline Queue & 描述&值 \\ \hline Background& 背景层。最先被渲染的队列& 1000 \\ \hline Geometry& 几何体。一般来说绘制不透明的物件& 2000 \\ \hline AlphaTest& 透明检测队列。本质上还是不透明队列。& 2450 \\ \hline GeometryLast& 最终几何体。这是不透明渲染的临界点& 2500 \\ \hline \hline Transparent& 透明混合队列。一般来说这队列中都是不写深度缓存的& 3000 \\ \hline \hline Overlay& 覆盖队列。比如UI 镜头光晕等等& 4000 \\ \hline \end{array}\\
队列的指定在Shader中使用ShaderTag {"Queue"="xxxx"}也可以填写xxx+1或者直接指定2440这样的绝对值。 其中0-2500 为不透明(Opaque)。2501-5000 透明(Alpha)。
Opaque[步骤]
在不透明队列中,同一个queue的物体按照物体参照摄影机的近->远顺序渲染。 这是因为,不透明物体一般要开启ZTest ZWrite。那么先渲染近的,就可以用深度剔除掉远的像素片段。从而降低了overDraw。
Alpha[步骤]
同一个Queue中的物体按照摄影机的远->近顺序渲染。 多层透明叠加必须按照先后顺序。同时半透明物体不能剔除被他遮盖的物体所以不能开ZWrite。
尽可能的遵守管线规则设置RenderQueue
总结
如何判断一个物体在何时渲染?
1·检查所对应的渲染器。
2·确定所处的渲染步骤。
3·比较Layer
4·比较Order
5·比较Queue