首发于 Shader lab
关于Unity中物体的渲染顺序

关于Unity中物体的渲染顺序

首先这是一个牵扯很多命题。

从应用层到底层管线各种设置都会影响最后的渲染顺序。 渲染顺序又是一个非常重要知识。

1·只有正确的渲染顺序才能得到正确结果

2·渲染顺序很大程度的影响渲染性能

3·同一个物体在不同情况下会有不同的顺序

渲染器

Unity中渲染一般是通过Camera.Render渲染物体。也有其他的渲染器。例如 GPUSkin/UI等 简单列举一下渲染器本身的顺序

  1. GPUSkin:gpu蒙皮。
  2. Camera.Render:正常的Camera渲染。
  3. UGUI.Rendering:UGUI Overlay模式用的渲染器。
  4. GUI.Repaint:OnGUI中IMGUI代码渲染。

多个Camera渲染,按照Camera.Depth排序。 多个OverLay UGUI按照Canvas.SortOder排序。 多个OnGUI脚本 按照脚本的激活顺序倒序排列。

渲染管线

Camera渲染的流程就是渲染管线。 目前Unity内置了Foward 和Deferred两种主要的管线。 同时UnitySRP管线提供了可扩展的管线支持。目前官方提供LDRP/HDRP两种SRP的扩展。

前向渲染 延迟渲染 LDRP/HDRP 可编程渲染管线

在Camera渲染中。管线决定了渲染流程中有多少个渲染步骤。即渲染顺序。 以[前向渲染]举例。 Foward中包含一下几个步骤,按顺序依次执行。

  1. DepthTexture
  2. DepthNormalsTexture
  3. ForwardOpaque
  4. ImageEffectsOpaque
  5. Skybox
  6. ForwardAlpha
  7. ImageEffects
  8. 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

编辑于 2021-09-02 10:52

文章被以下专栏收录