> 技术文档 > Unity中的渲染管线(十八):URP-延迟渲染路径_unity 延迟渲染

Unity中的渲染管线(十八):URP-延迟渲染路径_unity 延迟渲染

URP 通用渲染器支持两种渲染路径:前向渲染(Forward)和延迟渲染(Deferred)。本节详细介绍延迟渲染路径。

延迟渲染路径的场景渲染如下:


(此处为示意图,显示延迟渲染路径的场景效果)

(一).如何选择延迟渲染路径

要选择渲染路径,请在 URP 通用渲染器资源中使用光照 > 渲染路径(Lighting > Rendering Path) 属性:

  1. 在 URP 通用渲染器资源中选择渲染路径。
  2. 选择延迟渲染路径后,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 中存储材质属性(每个像素的数据结构):

组件 描述 反照率(Albedo,sRGB) 24 位 sRGB 格式的反照率颜色。 材质标志(MaterialFlags) 位字段,包含以下材质标志:
- 位 0:ReceiveShadowsOff(像素不接收动态阴影)
- 位 1:SpecularHighlightsOff(像素不接收高光)
- 位 2:SubtractiveMixedLighting(像素使用减法混合光照)
- 位 3:SpecularSetup(材质使用高光工作流)
- 位 4-7:保留供未来使用。详情参见/ShaderLibrary/UnityGBuffer.hlsl。 高光(Specular) 包含以下值:
- SimpleLit 材质:24 位 RGB 高光颜色
- 金属工作流 Lit 材质:8 位反射率(16 位未使用)
- 高光工作流 Lit 材质:24 位 RGB 高光颜色。 遮挡(Occlusion) 包含烘焙光照的烘焙遮挡值。对于实时光照,Unity 通过组合烘焙遮挡值和 SSAO 值计算环境遮挡。 法线(Normal) 24 位世界空间法线 平滑度(Smoothness) 存储 SimpleLit 和 Lit 材质的平滑度值。 自发光 / 全局光照 / 光照(Emissive/GI/Lighting) 包含材质自发光输出和烘焙光照。G-buffer 通道中填充此值,延迟着色通道中存储光照结果。
渲染目标格式:
- B10G11R11_UFloatPack32(除非满足以下条件之一)
- 若 URP 资源中启用 HDR 但目标平台不支持 HDR,或 Player 设置中 PreserveFramebufferAlpha 为 true,则使用 R16G6B16A16_SFloat
- 若无法使用上述格式,则使用 SystemInfo.GetGraphicsFormat (DefaultFormat.HDR) 返回的格式。 阴影遮罩(ShadowMask) 当光照模式设置为 Subtractive 或 Shadow mask 时添加到 G-buffer。这两种模式针对前向渲染优化,在延迟渲染中效率较低,建议使用 Baked Indirect 模式提升 GPU 性能。 渲染层遮罩(Rendering Layer Mask) 启用光照层功能(URP 资源 > 高级 > 光照层)时添加到 G-buffer,可能对 GPU 性能有显著影响。 深度作为颜色(Depth as Color) 在支持的平台上启用原生 Render Pass 时添加到 G-buffer,将深度渲染为颜色,用于提升 Vulkan 设备性能或在 Metal API 中获取深度缓冲(Metal 不允许在同一生成通道中从 DepthStencil 缓冲获取深度),格式为 GraphicsFormat.R32_SFloat。 深度模板(DepthStencil) 保留高 4 位标记材质类型,根据平台选择 D32F_S8 或 D24S8 格式。
G-buffer 中的法线编码

延迟渲染路径中,Unity 将法线以 24 位值存储在 G-buffer 中,编码方式由精确 G-buffer 法线属性控制:

  • 关闭时:法线向量值存储在法线纹理的 RGB 通道中(每个分量 8 位),通过量化压缩精度,提升性能但可能导致光滑表面色带伪影。
  • 开启时:使用八面体编码将法线向量值存储在 RGB 通道中,法线更精确,但编解码操作增加 GPU 负载(桌面和主机平台影响可忽略,移动 GPU 影响较大),且不增加内存占用。
(四).延迟渲染路径的渲染通道(Render Passes)

延迟渲染路径的通道执行顺序如下表:

渲染通道事件 延迟渲染路径通道 SSAO 渲染器功能通道 BeforeRendering BeforeRenderingShadows AfterRenderingShadows BeforeRenderingPrePasses 深度或深度 + 法线预通道(仅前向材质) AfterRenderingPrePasses BeforeRenderingGbuffer G-buffer 通道(GBufferPass) 复制 G-buffer 深度纹理 AfterRenderingGbuffer SSAO(可选) BeforeRenderingDeferredLights Deferred rendering (stencil) 延迟着色(模板) AfterRenderingDeferredLights BeforeRenderingOpaques 仅前向不透明材质 AfterRenderingOpaques SSAO 与混合(可选) BeforeRenderingSkybox AfterRenderingSkybox BeforeRenderingTransparents AfterRenderingTransparents BeforeRenderingPostProcessing AfterRenderingPostProcessing AfterRendering
关键通道说明:
  1. 深度 / 深度 + 法线预通道:仅渲染不支持延迟渲染模型的材质(如使用 Complex Lit 着色器的材质),若启用 SSAO 渲染器功能,则执行深度 + 法线预通道以计算环境遮挡。
  2. SSAO 通道:若启用 SSAO 且未启用 “After Opaque” 选项(默认禁用),则在 G-buffer 后执行,避免烘焙遮挡与实时遮挡双重暗化;移动平台启用 “After Opaque” 可避免额外渲染目标操作,提升性能。
  3. 仅前向通道(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 负载。