URP 渲染实战 / 第 23 章 阴影进阶 / 案例 23.5
案例 23.5让自定义 Shader 支持屏幕空间阴影入门
Lit 已经支持这个模式。自己写的 Shader 要支持,只需两点:一是在 multi_compile 里加上 _MAIN_LIGHT_SHADOWS_SCREEN;二是阴影坐标用 TransformWorldToShadowCoord 或 GetShadowCoord(vertexInput) 计算——它们内部已经处理了屏幕空间分支(返回屏幕坐标而不是阴影图坐标)。本章所有 Shader 都满足这两点。最常见的错误是只声明了 _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE:开启屏幕空间阴影后 URP 关掉了这两个关键字、打开了 _MAIN_LIGHT_SHADOWS_SCREEN,你的 Shader 找不到对应变体,只能用“无阴影”的那个变体,表现就是“加了 Screen Space Shadows 之后我的物体没影子了”。

_ScreenSpaceShadowmapTexture 的内容。球体背光面的黑色是它自己挡住自己的结果,最终着色时会被 N·L 乘掉注意屏幕空间阴影只对主光有效,附加光阴影不受影响;它依赖深度预渲染,所以场景中所有不透明物体都要有正确的 DepthOnly Pass(自写 Shader 没有 DepthOnly 时,它在深度图里是空的,屏幕空间阴影会落到它背后的物体上)。