unity 渲染层级详解

本文详细介绍了Unity中的渲染顺序控制,包括Camera的depth、Sorting Layer、Order In Layer、RenderQueue等概念。讲解了如何通过这些设置调整2D UI与模型的渲染层次,特别是在处理NGUI Panel时的策略,如更改RenderQueue、Order In Layer,以及针对Skinned Mesh Render的特殊处理。此外,还提出了处理模型与UI交互的潜在解决方案。

1  Camera 
Camera是unity中最优先的渲染顺序控制。depth越大,渲染顺序越靠后。 

2、Sorting Layer
在Tags & Layers设置中可见

3、Order In Layer
相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
4、RenderQueue
Shader中对Tags设置的“Queue”。

当Sorting Layer和Order In Layer相同时
RenderQueue小的先进渲染管线。

当Sorting Layer和Order In Layer不相同时!
当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。

当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在[0~2500]和[2501~5000]时,则一定会按照RenderQueue绘制,无视SortingLayer、OrderInLayer的排序


5、 MeshRenderer 和SpriteRenderer 都是继承于 Renderer 的组件 
它们的 sorting 和 orderinlayer 都是暴露出来的属性  可以在属性视图修改
模型蒙皮  skinn

### Unity 渲染流程详解及绘制性能优化 Unity渲染流程是一个高度复杂的系统,涉及多个阶段的协同工作,包括场景准备、渲染状态设置、绘制命令提交等。理解这些步骤对于优化绘制性能至关重要。 #### 渲染流程概述 Unity渲染流程从摄像机开始,依次执行剔除(Culling)、排序(Sorting)和绘制(Drawing)。在剔除阶段,引擎会判断哪些物体是当前摄像机可见的,并将它们提交到渲染队列中。接下来,根据材质和渲染队列对对象进行排序,以确保正确的渲染顺序。最后,通过 DrawCall 提交绘制命令,由 GPU 执行具体的像素着色操作[^1]。 渲染队列决定了物体的绘制顺序,Unity 预定义了几个主要队列: - **Background**:用于天空盒等背景元素; - **Geometry**:默认用于不透明几何体; - **AlphaTest**:适用于带有 Alpha 测试的物体; - **Transparent**:用于半透明物体; - **Overlay**:用于 UI 或覆盖层[^3]。 #### 绘制性能瓶颈与优化策略 ##### 1. DrawCall 过多导致 CPU 性能下降 每次调用 DrawCall 前,CPU 需要向 GPU 发送大量数据,包括顶点缓冲区、材质状态和纹理信息等。GPU 的绘制能力通常远高于 CPU 的提交速度,因此过多的 DrawCall 容易造成 CPU 成为瓶颈。优化目标应集中在减少 DrawCall 数量上[^4]。 常见的优化方式包括: - 使用纹理集(Texture Atlas)合并多个小纹理,使多个物体共享同一个材质; - 启用静态批处理(Static Batching),将不会移动的物体合并为一个网格; - 动态批处理(Dynamic Batching)适用于小型网格,但受限于顶点属性数量和变换复杂度。 ##### 2. OverDraw 过高影响 GPU 性能 OverDraw 是指同一像素被多次绘制的现象,常见于透明物体、UI 层级叠加以及渲染顺序不合理的情况。由于透明物体通常禁用深度写入(Z-Write),无法利用 Early-Z 技术提前剔除不可见像素,导致 GPU 多次执行片元着色器,显著增加带宽消耗[^1]。 优化方法包括: - 减少透明物体的使用,尽量使用 Alpha Test 替代 Alpha Blend; - 对 UI 元素进行层级合并,避免不必要的重叠; - 控制 UI 的 Mask 使用范围,避免全屏 Mask 导致的过度绘制。 ##### 3. Shader 编写与渲染状态配置 Shader 的编写质量直接影响渲染效率。不合理的光照计算、冗余的纹理采样或未关闭的雾效(Fog)都会增加 GPU 负担。建议采用以下做法: - 使用轻量级 Shader,如 Unlit 着色器用于不需要光照计算的对象; - 在 Shader 中启用 `ZWrite Off` 和 `ZTest LEqual` 以优化透明混合效果; - 关闭不必要的功能,例如动态阴影接收、反射探针等。 示例代码:优化透明混合的 Shader 设置 ```hlsl Shader "Custom/OptimizedTransparency" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } LOD 200 Pass { ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _MainTex; float4 _MainTex_ST; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } } ``` ##### 4. 渲染顺序与层级管理 Unity 默认按照距离摄像机的远近对 Geometry 队列中的物体进行排序,以提高 Z-Buffer 利用率。若手动调整渲染顺序(如设置 `Renderer.sortingOrder`),可能导致本应被遮挡的对象先绘制,从而引发额外的 OverDraw。 ##### 5. 使用调试工具分析性能问题 Unity 提供了多种调试工具帮助开发者识别性能瓶颈: - **Frame Debugger** 可查看每一帧中所有 DrawCall 的执行顺序; - **Profiler** 可监控 CPU/GPU 时间、内存占用等关键指标; - **Scene View Show Overdraw Mode** 可通过替换 Shader 显示 OverDraw 区域,辅助优化 UI 和透明物体布局。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值