1. ShadowCaster(核心 ------ 让物体能投影)
LightMode = ShadowCaster:URP 渲染 Shadow Map 时会调用此 PassColorMask 0:不输出颜色,只写深度- 顶点关键步骤:
TransformObjectToWorld/TransformObjectToWorldNormal拿到世界空间位置和法线- 通过
ApplyShadowBias(positionWS, normalWS, lightDirWS)做法线偏移和深度偏移,消除自阴影 acne TransformWorldToHClip投影到光源裁剪空间- 最后钳制
positionCS.z到UNITY_NEAR_CLIP_VALUE,防止偏移后越过近裁剪面
- 依据 keyword
_CASTING_PUNCTUAL_LIGHT_SHADOW区分方向光 / 聚光灯(用_LightDirection)和点光源(用_LightPosition做方向计算) _LightDirection/_LightPosition这两个全局变量由 URP 的ShadowCasterPassC# 代码每帧设置
2. DepthOnly(配套 ------ 写深度图)
LightMode = DepthOnly:URP 在生成_CameraDepthTexture时使用- 只写深度,
ColorMask 0 - 后处理(SSAO、景深、雾效、软粒子等)需要深度图时才会生效,没有它也不影响基本投影
现在的渲染行为
| 功能 | 是否支持 |
|---|---|
| 接收主光源阴影(原 ASE 效果) | ✓ |
| 投影到地面/其它物体 | ✓(新增) |
| 点光源/聚光灯阴影投射 | ✓(通过 _CASTING_PUNCTUAL_LIGHT_SHADOW) |
参与 _CameraDepthTexture |
✓(新增) |
参与 _CameraNormalsTexture(SSAO 用) |
✗(若后续需要可加 DepthNormals Pass) |
如果还需要 DepthNormalsOnly(SSAO 的 Depth Normal 模式会用到),告诉我再补上。
DepthOnly 这个pass做什么用的
DepthOnly Pass 是做什么的
一句话概括
DepthOnly Pass 的作用是:当 URP 需要单独生成一张"全场景深度图"(_CameraDepthTexture)时,用它把这个物体的深度写进去,而不输出任何颜色。
它不是用来"投影"的
很多人会把它和 ShadowCaster 搞混,区别如下:
| Pass | 谁在调用 | 写入目标 | 用途 |
|---|---|---|---|
ShadowCaster |
URP 的 MainLightShadowCasterPass / AdditionalLightsShadowCasterPass |
光源视角的 Shadow Map | 投影 ------ 让别的物体能"看到"此物体投下的阴影 |
DepthOnly |
URP 的 DepthOnlyPass / DepthPrepass |
摄像机视角的 _CameraDepthTexture |
深度图 ------ 给后处理、特效采样深度用 |
两个 Pass 视角不同、目标 RT 也不同。
什么时候会被调用
URP 只在满足以下任一条件时才会跑 DepthOnly:
- Universal Renderer 里勾选了 "Depth Texture"(或某个后处理/Feature 需要它)
- 场景中有脚本 / Shader 访问
_CameraDepthTexture - 开启了依赖深度图的特性,常见的有:
- SSAO(Screen Space Ambient Occlusion)
- 后处理中的景深(Depth of Field)
- 软粒子(Soft Particles)
- 体积雾 / 高度雾
- 屏幕空间反射 / 折射、水面、某些后处理描边
- 部分自定义 Shader
而且 URP 会自动选择使用 Depth Prepass(提前跑一遍 DepthOnly)还是 从 GBuffer / Opaque 拷贝,策略由 Renderer 设置决定。
如果没有 DepthOnly 会怎样
- 不影响你物体自身的渲染 ------ Forward Pass 照常输出颜色
- 不影响它投射阴影 ------ 那是
ShadowCaster的事 - 但是:当 URP 走 Depth Prepass 模式时,没有
DepthOnly的物体会在_CameraDepthTexture里缺失- 后果:SSAO 不作用在它身上、后处理景深对它失效、软粒子穿模、体积雾里它没遮挡......
和 DepthNormals 的关系
还有一个兄弟 Pass:
DepthOnly(LightMode = DepthOnly):只写深度DepthNormals(LightMode = DepthNormalsOnly):同时写深度 + 世界空间法线,SSAO 的 "Depth Normals" 模式会用它
URP 会根据 Renderer 设置二选一调用,所以严谨做法是两个都提供。