FeastSC 发表于 2021-12-3 09:06

关于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中按照队列数值分为一下几个队列。

https://www.zhihu.com/equation?tex=%5Cbegin%7Barray%7D%5Bb%5D+%7B%7Cc%7Cc%7C%7D++%5Chline+Queue+%26+%E6%8F%8F%E8%BF%B0%26%E5%80%BC+%5C%5C++%5Chline+Background%26+%E8%83%8C%E6%99%AF%E5%B1%82%E3%80%82%E6%9C%80%E5%85%88%E8%A2%AB%E6%B8%B2%E6%9F%93%E7%9A%84%E9%98%9F%E5%88%97%26+1000+%5C%5C++%5Chline+Geometry%26+%E5%87%A0%E4%BD%95%E4%BD%93%E3%80%82%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E7%BB%98%E5%88%B6%E4%B8%8D%E9%80%8F%E6%98%8E%E7%9A%84%E7%89%A9%E4%BB%B6%26+2000+%5C%5C++%5Chline+AlphaTest%26+%E9%80%8F%E6%98%8E%E6%A3%80%E6%B5%8B%E9%98%9F%E5%88%97%E3%80%82%E6%9C%AC%E8%B4%A8%E4%B8%8A%E8%BF%98%E6%98%AF%E4%B8%8D%E9%80%8F%E6%98%8E%E9%98%9F%E5%88%97%E3%80%82%26+2450+%5C%5C++%5Chline+GeometryLast%26+%E6%9C%80%E7%BB%88%E5%87%A0%E4%BD%95%E4%BD%93%E3%80%82%E8%BF%99%E6%98%AF%E4%B8%8D%E9%80%8F%E6%98%8E%E6%B8%B2%E6%9F%93%E7%9A%84%E4%B8%B4%E7%95%8C%E7%82%B9%26+2500+%5C%5C+%5Chline+%5Chline+Transparent%26+%E9%80%8F%E6%98%8E%E6%B7%B7%E5%90%88%E9%98%9F%E5%88%97%E3%80%82%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%E8%BF%99%E9%98%9F%E5%88%97%E4%B8%AD%E9%83%BD%E6%98%AF%E4%B8%8D%E5%86%99%E6%B7%B1%E5%BA%A6%E7%BC%93%E5%AD%98%E7%9A%84%26+3000+%5C%5C+%5Chline+%5Chline+Overlay%26+%E8%A6%86%E7%9B%96%E9%98%9F%E5%88%97%E3%80%82%E6%AF%94%E5%A6%82UI+%E9%95%9C%E5%A4%B4%E5%85%89%E6%99%95%E7%AD%89%E7%AD%89%26+4000++%5C%5C+%5Chline+%5Cend%7Barray%7D%5C%5C
队列的指定在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
页: [1]
查看完整版本: 关于Unity中物体的渲染顺序