flowchart TD
A[开始帧] --> B[FakeShadowRenderPass.RecordRenderGraph]
B --> C[深度写入 Pass - 仅角色层]
C --> D[阴影图集 Pass - 执行所有 FakeShadow Pass]
D --> E[全局设置 _DecalTexture]
E --> F[角色主渲染 Pass - 绑定 _DecalTexture 并绘制]
F --> G[DecalProjector 投影阴影到地面]
- 深度预写入
- 仅渲染
characterLayer 指定的物体到相机深度,供后续 Decal 正确混合。
- 阴影图集生成
- 遍历所有激活的
FakeShadow 实例(已分配到图集索引),执行 LightMode = "FakeShadow" 的 Pass。
- 顶点着色器将物体从世界坐标变换到图集网格的 屏幕空间坐标 (利用
_FakeShadowLine 网格划分和 _FakeShadowOffset 偏移)。
- 片元输出固定颜色
_FakeShadowColor,支持矩形裁剪 (FAKE_CLIP)。
- 全局纹理绑定
- 图集 RT 通过
SetGlobalTexture("_DecalTexture", ...) 全局可用。
- 主渲染 + Decal 投影
- 角色材质(如
SimpleLitFakeShadow)正常渲染。
- 场景中的
DecalProjector 使用 UTJ/FakeShadowByDecal 材质,采样 _DecalTexture,根据投影仪方向将阴影投射到地面。
| 参数 |
作用 |
projector |
关联的 DecalProjector,决定阴影大小、位置及投影方向。 |
shadowDirection |
非零时覆盖投影仪旋转,固定阴影投射方向(欧拉角)。 |
isStatic |
静态阴影不每帧更新 View 矩阵。 |
shadowMesh |
启用时,所有 Renderer 共享同一个材质(节省 DrawCall)。 |
glidClipping |
启用 FAKE_CLIP 关键字,裁剪超出投影仪范围的阴影像素。 |
| 参数 |
作用 |
characterLayer |
指定哪些 Layer 参与阴影生成。 |
fakeShadowShader |
用于生成阴影图集的材质 Shader(通常为 FakeShadowCaster)。 |
maxShadowCount |
最大阴影实例数(≤ 25),直接影响图集网格密度。 |
decalMapSize |
图集分辨率(px),建议 256~1024。 |
| 关键字 |
作用 |
FAKE_CLIP |
片元阶段根据 _FakeClipRect 裁剪阴影像素。 |
DECAL_ANGLE_FADE |
Decal 材质根据表面法线与投影仪夹角淡出阴影。 |
- 导入资源 :将
.cs、.shader 文件放入工程。
- 配置 URP 管线资产
- 添加
DecalRendererFeature(确保 URP 开启 Decal 支持)。
- 添加
FakeShadowPassFeature,设置角色 Layer 与最大阴影数。
- 角色材质替换
- 角色需使用
UTJ/SimpleLitFakeShadow 或其变体(必须包含 FakeShadow Pass)。
- 场景设置
- 为地面物体添加
DecalProjector,材质选 UTJ/FakeShadowByDecal。
- 需要阴影的角色挂载
FakeShadow 脚本并拖拽投影仪引用。
- 运行时调用
- 脚本
Wakeup() 初始化,Sleep() 释放图集槽位。
- 可通过
FakeShadowManager.color 全局修改阴影颜色。
| 项目 |
建议 / 限制 |
| 最大实例数 |
硬编码 SHADOW_LIMIT = 25(5×5 网格),实际受 maxShadowCount 限制。 |
| 图集开销 |
每帧 decalMapSize^2 填充率 + N 次阴影几何体绘制(N = 活动阴影数)。 |
| Depth Priming |
自动检测 URP 设置,启用时可减少 overdraw。 |
| 移动端兼容 |
Shader 目标等级 2.5/4.5,建议关闭 DECAL_ANGLE_FADE 降低复杂度。 |
| 不支持 |
阴影无法接收动态光影、半透明阴影、复杂形状(仅基于网格轮廓)。 |
| 已知限制 |
shadowMesh 模式下所有物体共享材质,可能丢失原始 MaterialPropertyBlock 数据。 |
- 若要支持更多阴影实例,修改
FakeShadowManager.SHADOW_LIMIT 并调整 decalMapSize 比例(保持幂次)。
- 可通过修改
_FakeShadowLine 的全局值,改变图集网格划分(当前自动根据 maxShadowCount 计算)。
- 如需阴影颜色随实例变化,可扩展
MatParam 并传入 per-instance 属性块。
- 对于静态场景物体(如建筑),可将
isStatic 勾选并预先烘焙矩阵,降低 CPU 开销。