Unity 渲染顺序

Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会覆盖depth低的相机(具体的覆盖关系有don't clear, solid color等等几种) 

 

比Camera层稍低一层的是sorting layer层,随便找一个可以设置sorting layer的地方,选择sorting layer,点添加按钮,就可以看到当前所有的sorting layer,并且可以更改sorting layer的顺序,排位靠后的sorting layer会覆盖排位靠前的sorting layer。设置好sorting layer的相互关系之后,就可以给任何一个继承于Renderer类,或者有renderer的子类作为field的对象设置sorting layer了。注意这些sorting layer的遮挡关系是在同一个camera的层级下的。不同camera下的renderer渲染顺序以camera的depth为准。有的component的sorting layer可以直接在unity editor里面设置,比如Sprite Renderer。有的则需要用代码来设置,比如设置Particle system的sorting layer,就需要在代码中取到 ParticleSystem.Renderer.SortingLayer 来进行设置。 

 

比sorting layer再低一层的是sorting order,这个数字指代的是在同一个sorting layer下的渲染顺序,用法很明显就不赘述了。 

 

需要注意不要混淆的是gameobject的layer,和renderer的sorting layer。 gameObject的layer个人理解是一个逻辑上的分层,用于camera的culling mask等。而renderer的sorting layer则用于渲染。只有继承与renderer或者有renderer作为filed的component才需要设置sorting layer。 

 

另外需要指出的是,常用的NGUI的widget depth其本质也是一个sorting layer下的sorting order。 NGUI好像用的是一个叫做“UI"的sorting layer。由此大家如果有需要,也可以自己取Hack NGUI的代码,把NGUI的sorting layer暴露出来供自己定制。 

 

简单总结一下,决定Unity渲染关系的层级顺序是:

 

Camera

 

sorting layer

 

sortingorder
Unity Shader 的渲染顺序主要涉及两个方面,一是 SubShader 的选择,二是渲染队列的确定。 当第一次使用 Shader object 渲染几何体、shader LOD value 改变或者当前激活的 render pipeline 改变时,需要重新设定激活的 SubShader。Unity 会遍历 SubShader 列表,检查它们是否与当前硬件设备兼容、LOD 值是否等于或小于当前的 shader LOD 值以及是否与当前激活的 render pipeline 兼容。若列表中有一个或多个 SubShader 符合要求,第一个符合要求的 SubShader 会被选为 Active SubShader;若不存在符合所有要求的 SubShader,但有满足硬件兼容要求但不满足 LOD 或 RenderPipeline 要求的,会选择第一个这样的 SubShader;若不存在满足硬件兼容要求的 SubShader,则显示 error shader。渲染一个 Batch 时,Unity 会确定当前 Active SubShader 的哪个 pass 需要被渲染以及在当前帧的哪个点渲染,该行为会根据 render pipeline 变化。渲染每个 Pass 时,若当前的 render state 和 Pass 中定义的 render state 不匹配,Unity 会根据 Pass 中的定义设置 render state,GPU 则使用相关的 shader 变体进行渲染[^1]。 渲染队列由 SubShader 的 Queue 标签决定,Unity 内部使用一系列整数索引表示每个渲染队列,索引号越小越早被渲染。各渲染队列的情况如下: - Background(队列索引号 1000):在任何其他队列之前被渲染,用于渲染需要绘制在背景上的物体[^2][^3]。 - Geometry(队列索引号 2000):默认的渲染队列,大多数物体和不透明物体使用该队列[^2][^3]。 - AlphaTest(队列索引号 2450):需要透明度测试的物体使用该队列,在 Unity 5 中从 Geometry 队列中单独分出,在所有不透明物体渲染后再渲染它们更高效[^2][^3]。 - Transparent(队列索引号 3000):在所有 Geometry 和 AlphaTest 物体渲染后,按从后往前的顺序进行渲染,使用透明度混合(如关闭了深度写入的 Shader)的物体应使用该队列[^2][^3]。 - Overlay(队列索引号 4000):用于实现叠加效果,需要在最后渲染的物体使用该队列[^2][^3]。 此外,RenderQueue 有个关键值 2500,它是透明与不透明的分界点。RenderQueue <= 2500 的物体先遵循 RenderQueue 越小越先渲染,当 RenderQueue 相同时距离摄像机越近越先渲染;RenderQueue > 2500 的物体先遵循 RenderQueue 越小越先渲染,当 RenderQueue 相同时距离摄像机越远越先渲染,且 RenderQueue 优先级大于深度值[^4]。 ### 代码示例 以下是一个简单的 Unity Shader 示例,展示了如何使用 Queue 标签: ```glsl Shader "Custom/ExampleShader" { SubShader { Tags { "Queue" = "Transparent" } Pass { // Pass 内容 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值