Skip to content

jackylong/fakeshadow

Repository files navigation

flowchart TD A[开始帧] --> B[FakeShadowRenderPass.RecordRenderGraph] B --> C[深度写入 Pass - 仅角色层] C --> D[阴影图集 Pass - 执行所有 FakeShadow Pass] D --> E[全局设置 _DecalTexture] E --> F[角色主渲染 Pass - 绑定 _DecalTexture 并绘制] F --> G[DecalProjector 投影阴影到地面]

详细步骤

  1. 深度预写入
    • 仅渲染 characterLayer 指定的物体到相机深度,供后续 Decal 正确混合。
  2. 阴影图集生成
    • 遍历所有激活的 FakeShadow 实例(已分配到图集索引),执行 LightMode = "FakeShadow" 的 Pass。
    • 顶点着色器将物体从世界坐标变换到图集网格的 屏幕空间坐标 (利用 _FakeShadowLine 网格划分和 _FakeShadowOffset 偏移)。
    • 片元输出固定颜色 _FakeShadowColor,支持矩形裁剪 (FAKE_CLIP)。
  3. 全局纹理绑定
    • 图集 RT 通过 SetGlobalTexture("_DecalTexture", ...) 全局可用。
  4. 主渲染 + Decal 投影
    • 角色材质(如 SimpleLitFakeShadow)正常渲染。
    • 场景中的 DecalProjector 使用 UTJ/FakeShadowByDecal 材质,采样 _DecalTexture,根据投影仪方向将阴影投射到地面。

关键参数说明

FakeShadow 组件

参数 作用
projector 关联的 DecalProjector,决定阴影大小、位置及投影方向。
shadowDirection 非零时覆盖投影仪旋转,固定阴影投射方向(欧拉角)。
isStatic 静态阴影不每帧更新 View 矩阵。
shadowMesh 启用时,所有 Renderer 共享同一个材质(节省 DrawCall)。
glidClipping 启用 FAKE_CLIP 关键字,裁剪超出投影仪范围的阴影像素。

FakeShadowPassFeature

参数 作用
characterLayer 指定哪些 Layer 参与阴影生成。
fakeShadowShader 用于生成阴影图集的材质 Shader(通常为 FakeShadowCaster)。
maxShadowCount 最大阴影实例数(≤ 25),直接影响图集网格密度。
decalMapSize 图集分辨率(px),建议 256~1024。

Shader 关键字

关键字 作用
FAKE_CLIP 片元阶段根据 _FakeClipRect 裁剪阴影像素。
DECAL_ANGLE_FADE Decal 材质根据表面法线与投影仪夹角淡出阴影。

使用步骤

  1. 导入资源 :将 .cs.shader 文件放入工程。
  2. 配置 URP 管线资产
    • 添加 DecalRendererFeature(确保 URP 开启 Decal 支持)。
    • 添加 FakeShadowPassFeature,设置角色 Layer 与最大阴影数。
  3. 角色材质替换
    • 角色需使用 UTJ/SimpleLitFakeShadow 或其变体(必须包含 FakeShadow Pass)。
  4. 场景设置
    • 为地面物体添加 DecalProjector,材质选 UTJ/FakeShadowByDecal
    • 需要阴影的角色挂载 FakeShadow 脚本并拖拽投影仪引用。
  5. 运行时调用
    • 脚本 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 开销。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors