找回密码
 立即注册
查看: 439|回复: 0

关于Unity中物体的渲染顺序

[复制链接]
发表于 2021-12-3 09:06 | 显示全部楼层 |阅读模式
首先这是一个牵扯很多命题。
从应用层到底层管线各种设置都会影响最后的渲染顺序。 渲染顺序又是一个非常重要知识。
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中按照队列数值分为一下几个队列。


队列的指定在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
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 03:27 , Processed in 0.137313 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表