Wiki
559 words
3 minutes
渲染队列

什么是渲染队列?#

渲染队列(Render Queue)是 Unity 用于控制物体渲染顺序的机制。通过在 SubShader 的 Tags 中设置 Queue 标签,可以指定一个物体属于哪个渲染阶段。Unity 渲染器会按照队列索引值从小到大依次渲染。

Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }

内置渲染队列#

名称队列索引用途
Background1000最先渲染,用于天空盒等背景
Geometry2000默认队列,大多数不透明物体
AlphaTest2450透明度测试物体,在不透明物体之后渲染
Transparent3000透明度混合物体,从后往前渲染
Overlay4000最后渲染,镜头光晕等叠加效果

也可以使用相对值,例如 "Queue" = "Transparent+1" 来微调顺序。

为什么顺序很重要?#

对于不透明物体,GPU 通过深度测试可以自动处理遮挡,渲染顺序无所谓。

对于透明物体,由于依赖颜色混合(将当前片元颜色与颜色缓冲中的颜色叠加),必须从后往前渲染才能得到正确结果——这就是画家算法(Painter’s Algorithm)

两种透明效果的队列选择#

透明度测试(Alpha Test)#

使用 clip() 函数根据 Alpha 值丢弃片元,效果只有完全可见或完全不可见两种状态:

Tags { "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" }
// 片元着色器中
clip(texColor.a - _Cutoff); // Alpha 低于阈值则丢弃该片元

优点:不需要关闭深度写入,没有渲染顺序问题。

透明度混合(Alpha Blend)#

使用 Blend 命令进行颜色混合,可实现真正的半透明效果:

Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" }
Pass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
}

混合公式:Output = SrcAlpha × SrcColor + (1 - SrcAlpha) × DstColor

缺点:需要关闭深度写入,复杂交叉结构可能出现渲染错误。

常用混合模式#

写法效果
Blend SrcAlpha OneMinusSrcAlpha标准透明混合
Blend One One加法混合(发光、粒子特效)
Blend DstColor Zero正片叠底
Blend OneMinusDstColor One柔和叠加

相关知识#

  • 深度缓冲 — 与渲染顺序密切相关的 GPU 缓冲区
  • SRP Batch — URP 中影响多 Pass 透明渲染的合批技术
渲染队列
https://fuwari.vercel.app/wiki/render-queue/
Author
Qingswe
Published at
2024-07-06
License
CC BY-NC-SA 4.0