Unity中的渲染管线(十八):URP-延迟渲染路径_unity 延迟渲染
URP 通用渲染器支持两种渲染路径:前向渲染(Forward)和延迟渲染(Deferred)。本节详细介绍延迟渲染路径。
延迟渲染路径的场景渲染如下:
(此处为示意图,显示延迟渲染路径的场景效果)
(一).如何选择延迟渲染路径
要选择渲染路径,请在 URP 通用渲染器资源中使用光照 > 渲染路径(Lighting > Rendering Path) 属性:
- 在 URP 通用渲染器资源中选择渲染路径。
- 选择延迟渲染路径后,Unity 会显示精确 G-buffer 法线(Accurate G-buffer normals) 属性,用于配置法线在几何缓冲区(G-buffer)中的编码方式:
- 关闭精确 G-buffer 法线:提升性能(尤其在移动 GPU 上),但可能导致光滑表面出现色带伪影。
- 开启精确 G-buffer 法线:使用八面体编码将法线向量值存储在法线纹理的 RGB 通道中,法线更精确,但编解码操作会增加 GPU 负载。
(二).Unity Player 系统要求
延迟渲染路径除 Unity Player 的常规系统要求外,还有以下额外要求和限制:
- 最低着色器模型:Shader Model 4.5。
- 不支持 OpenGL 和 OpenGL ES API。若为使用这些 API 的平台构建项目,应用会回退到前向渲染路径。
(三).实现细节
G-buffer 布局
延迟渲染路径中,Unity 按以下结构在 G-buffer 中存储材质属性(每个像素的数据结构):
- 位 0:ReceiveShadowsOff(像素不接收动态阴影)
- 位 1:SpecularHighlightsOff(像素不接收高光)
- 位 2:SubtractiveMixedLighting(像素使用减法混合光照)
- 位 3:SpecularSetup(材质使用高光工作流)
- 位 4-7:保留供未来使用。详情参见
/ShaderLibrary/UnityGBuffer.hlsl
。- SimpleLit 材质:24 位 RGB 高光颜色
- 金属工作流 Lit 材质:8 位反射率(16 位未使用)
- 高光工作流 Lit 材质:24 位 RGB 高光颜色。
渲染目标格式:
- B10G11R11_UFloatPack32(除非满足以下条件之一)
- 若 URP 资源中启用 HDR 但目标平台不支持 HDR,或 Player 设置中 PreserveFramebufferAlpha 为 true,则使用 R16G6B16A16_SFloat
- 若无法使用上述格式,则使用 SystemInfo.GetGraphicsFormat (DefaultFormat.HDR) 返回的格式。
G-buffer 中的法线编码
延迟渲染路径中,Unity 将法线以 24 位值存储在 G-buffer 中,编码方式由精确 G-buffer 法线属性控制:
- 关闭时:法线向量值存储在法线纹理的 RGB 通道中(每个分量 8 位),通过量化压缩精度,提升性能但可能导致光滑表面色带伪影。
- 开启时:使用八面体编码将法线向量值存储在 RGB 通道中,法线更精确,但编解码操作增加 GPU 负载(桌面和主机平台影响可忽略,移动 GPU 影响较大),且不增加内存占用。
(四).延迟渲染路径的渲染通道(Render Passes)
延迟渲染路径的通道执行顺序如下表:
关键通道说明:
- 深度 / 深度 + 法线预通道:仅渲染不支持延迟渲染模型的材质(如使用 Complex Lit 着色器的材质),若启用 SSAO 渲染器功能,则执行深度 + 法线预通道以计算环境遮挡。
- SSAO 通道:若启用 SSAO 且未启用 “After Opaque” 选项(默认禁用),则在 G-buffer 后执行,避免烘焙遮挡与实时遮挡双重暗化;移动平台启用 “After Opaque” 可避免额外渲染目标操作,提升性能。
- 仅前向通道(Forward-only Pass):渲染不支持延迟渲染的材质(如 Complex Lit、Baked Lit、Unlit 或未声明延迟渲染所需标签的自定义着色器),需先在深度 + 法线预通道渲染以支持 SSAO 计算。
(五).相关代码文件
- 处理延迟渲染路径的主类:
com.unity.render-pipelines.universal\\Runtime\\DeferredLights.cs
- G-buffer 通道的 ScriptableRenderPass:
com.unity.render-pipelines.universal\\Runtime\\Passes\\GBufferPass.cs
- 延迟着色通道的 ScriptableRenderPass:
com.unity.render-pipelines.universal\\Runtime\\Passes\\DeferredPass.cs
- 延迟着色的着色器资源:
com.unity.render-pipelines.universal\\Shaders\\Utils\\StencilDeferred.shader
- 延迟着色工具函数:
com.unity.render-pipelines.universal\\Shaders\\Utils\\Deferred.hlsl
- G-buffer 材质属性存储 / 加载工具函数:
com.unity.render-pipelines.universal\\Shaders\\Utils\\UnityGBuffer.hlsl
ShaderLab 通道标签
若要使着色器支持延迟渲染,需包含以下标签:
- \"LightMode\" = \"UniversalGBuffer\":在 G-buffer 通道中执行。
- \"LightMode\" = \"UniversalForwardOnly\" 或 \"LightMode\" = \"DepthNormalsOnly\":标记材质在延迟渲染中使用仅前向通道。
- \"UniversalMaterialType\":指定着色器光照模型(Lit/SimpleLit)。
(六).限制和性能
地形混合(Terrain Blending)
- 混合超过 4 层地形时,延迟渲染与前向渲染结果略有不同:前向渲染分多通道处理每 4 层地形并混合光照,延迟渲染在 G-buffer 中一次性合并地形层,导致法线等属性组合精度不足。
- 注意:开启精确 G-buffer 法线会破坏地形混合(八面体编码的法线无法通过 alpha 混合正确合并),若应用需要超过 4 层地形,需关闭此选项。
烘焙全局光照与光照模式
- 启用烘焙全局光照时,Subtractive 和 Shadowmask 光照模式在延迟渲染中会增加 GPU 负载(需在 ShadowMask 渲染目标中存储额外属性),建议使用 Baked Indirect 模式以提升性能。
光照层(Light Layers)
- 启用光照层功能需额外 G-buffer 渲染目标(32 位),可能对 GPU 性能产生负面影响。
(七).视觉对比与性能建议
- 地形渲染差异:前向渲染对多层地形的光照计算更精确,延迟渲染因 G-buffer 合并限制可能产生视觉差异。
- 移动平台优化:关闭精确 G-buffer 法线、启用 SSAO 的 “After Opaque” 选项,可减少 GPU 负载。