在 Unity 的通用渲染管线(URP,Universal Render Pipeline)中,LightMode 标签决定了 Shader 中的一个 Pass 在管线的哪个阶段、为了什么目的被执行。不同的 LightMode 对应着不同的渲染逻辑。
以下是这些常用 LightMode 的核心区别:
1. UniversalForward
-
全称:前向渲染路径
-
用途:这是常规渲染通道。用于计算物体接收到的所有实时光照、阴影和主纹理颜色,最终输出到屏幕(或颜色缓冲区)。
-
发生时机:在
ForwardRendering(前向渲染)或Forward+的绘制调用中。 -
关键特性:
-
处理多光源(在单Pass或额外的Add Pass中)。
-
通常包含
"LightMode" = "UniversalForward"的 Pass 用于主渲染(Main Light + 部分额外光源),也可能有"LightMode" = "UniversalForwardOnly"用于强制前向渲染。
-
2. ShadowCaster
-
用途:生成阴影贴图。这个 Pass 不计算颜色,只计算深度。
-
发生时机:在渲染阴影贴图的阶段。
-
关键特性:
-
顶点着色器通常将顶点转换到光源空间。
-
片元着色器通常只输出深度(或者对于Alpha Test的物体,进行透明度裁剪)。
-
如果一个物体没有这个 Pass,它将无法投射阴影(即使开启了 Cast Shadows)。
-
3. UniversalGBuffer
-
用途:延迟渲染路径。将物体的几何信息(漫反射颜色、法线、光滑度、深度等)写入多个渲染目标(MRT,Multiple Render Targets)。
-
发生时机:在启用了延迟渲染(Deferred)的 URP 项目中。
-
关键特性:
-
不计算最终光照,只存储数据到 GBuffer。
-
随后在屏幕空间进行光照计算。
-
不支持半透明物体(半透明通常需要回退到前向渲染)。
-
4. DepthOnly
-
用途:仅输出深度。用于生成相机的深度纹理(_CameraDepthTexture)或需要深度的特效。
-
发生时机:当管线需要获取场景深度信息时(例如,开启了 Depth Texture 选项,或者后处理需要深度)。
-
关键特性:
-
比 ShadowCaster 更简单,通常只将顶点转换到相机空间,输出深度。
-
对于不透明物体,这是渲染深度的标准 Pass。
-
5. DepthNormals
-
用途:输出深度和法线。用于生成相机的深度法线纹理(_CameraDepthNormalsTexture)。
-
发生时机:当管线需要深度+法线信息时(例如,某些后处理效果如 SSAO(屏幕空间环境光遮蔽)需要法线信息)。
-
关键特性:
-
在一个纹理中同时编码深度和法线数据。
-
6. SceneSelectionPass
-
用途:编辑器专用。用于在 Unity 编辑器的 Scene 视图中,通过鼠标点击选中物体。
-
发生时机:仅在编辑器中,当你点击或框选物体时。
-
关键特性:
-
它利用物体在 GPU 端的 ID 来渲染,使得引擎能够识别你点击的是哪个物体。
-
注意:通常不会在游戏构建中包含它。
-
7. Meta
-
用途:全局光照烘焙(Baked GI)。用于为光照贴图(Lightmap)或 Light Probe(光照探针)提供材质的发射(Emission)和反照率(Albedo)信息。
-
发生时机:仅在离线烘焙光照贴图时(或者在 API 调用
Lightmapping.Bake时)。 -
关键特性:
-
不管场景里的实时灯光如何,它输出的是该物体“应该贡献给光照贴图的数据”。
-
重要:运行时(Play 模式)默认情况下,这个 Pass 不被执行(除非为了调试)。
-
总结表格
| LightMode 标签 | 主要用途 | 发生时机 | 输出内容 |
|---|---|---|---|
| UniversalForward | 正常渲染 | 实时渲染(前向/Forward+) | 最终颜色(带光照) |
| ShadowCaster | 投射阴影 | 渲染阴影贴图时 | 深度(光源空间) |
| UniversalGBuffer | 延迟渲染几何体 | 实时渲染(延迟) | 多张纹理(颜色、法线等) |
| DepthOnly | 生成相机深度纹理 | 需要场景深度时 | 深度(相机空间) |
| DepthNormals | 生成相机深度+法线 | 需要深度法线时(如 SSAO) | 编码的深度和法线 |
| SceneSelectionPass | 编辑器物体高亮/选中 | 编辑器中点击物体时 | 物体 ID 颜色 |
| Meta | 光照贴图烘焙 | 离线烘焙时 | Albedo 和 Emission 值 |
对于自定义 Shader 编写:
为了让一个 Shader 在 URP 中正常工作(不透明物体),通常需要包含至少 UniversalForward 和 ShadowCaster。如果物体需要参与深度纹理,还需要 DepthOnly;如果需要参与 SSAO,则需要 DepthNormals。如果是用于编辑器,通常 Unity 内置的 Shader 已经处理好了 SceneSelectionPass。

898

被折叠的 条评论
为什么被折叠?



