在 Unity 的 URP 中,SubShader 中的不同 Pass 可以有不同的 Tags,例如 LightMode。这些 Tags 用于告诉渲染管线在何时使用该 Pass。不同 LightMode 的 Pass 通常不会在同一渲染阶段全部执行,而是根据渲染管线和渲染阶段选择性地执行某一个或多个。
LightMode Tags
以下是一些常见的 LightMode 标签及其含义:
ForwardBase: 用于处理正向渲染的主要光源(通常是最亮的方向光)。ForwardAdd: 用于处理正向渲染中的额外光源。Deferred: 用于延迟渲染路径的几何阶段。ShadowCaster: 用于处理阴影投射阶段。Meta: 用于光照贴图生成和光照探针渲染。
Pass 的执行
基于 LightMode 标签,不同的 Pass 会在不同的渲染阶段被执行。举个例子:
Shader "Example/LightModePasses"
{
SubShader
{
Tags { "RenderType" = "Opaque" }
Pass
{
Name "ForwardBase"
Tags { "LightMode" = "ForwardBase" }
// 设置用于主要光源的渲染状态和着色器程序
}
Pass
{
Name "ForwardAdd"
Tags { "LightMode" = "ForwardAdd" }
// 设置用于附加光源的渲染状态和着色器程序
}
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
// 设置用于阴影投射的渲染状态和着色器程序
}
}
}
在这个示例中:
ForwardBasePass会在处理主要光源时被执行。ForwardAddPass会在处理额外光源时被执行。ShadowCasterPass会在计算阴影时被执行。
渲染阶段的选择
渲染管线会根据当前的渲染阶段和光照情况选择合适的 Pass 执行。例如:
- 在正向渲染过程中,首先会执行带有
ForwardBase标签的Pass,然后对于每个额外的光源,执行带有ForwardAdd标签的Pass。 - 在阴影渲染过程中,只会执行带有
ShadowCaster标签的Pass。
因此,不同的 Pass 不会在同一渲染阶段全部执行,而是根据 LightMode 标签在特定的渲染阶段选择性地执行相应的 Pass。这种机制使得同一个 SubShader 能够在不同的渲染阶段执行不同的渲染任务。
- 本文固定链接: https://bonostallone.com/?p=165
- 转载请注明: bono 于 明天的烟火 发表