【URP】Unity光照阴影Light shadow
【从UnityURP开始探索游戏渲染】专栏-直达
URP 光照阴影 使用 阴影贴图 (Shadow Maps) 和 阴影级联 (Shadow Cascades)。屏幕空间阴影渲染器功能 (Screen Space Shadows Renderer Feature),使 URP 通过单一渲染纹理计算并绘制主方向光的阴影,而不是使用多个阴影级联贴图。
URP阴影系统核心机制
- 阴影贴图Shadow Maps
- 通过光源视角的深度渲染生成_MainLightShadowmapTexture
- 使用ShadowCaster Pass(需声明LightMode标签)生成深度数据
- 通过_ShadowBias参数解决自阴影问题(含深度/法线偏移)
- 阴影级联Cascaded Shadow Maps
- 将视锥体分割为近/中/远多级区域(默认4级)
- 不同级联使用_MainLightShadowmapTexture的不同区域
- 通过MainLightShadowCasterPass.cs动态计算级联边界
- 屏幕空间阴影Screen Space Shadows
- 基于_CameraDepthTexture和阴影贴图实时混合计算
- 相比级联方案减少纹理采样但增加GPU计算负担
- 适合移动端等需要减少带宽的场景
关键实现原理
-
阴影生成流程
- 深度图渲染阶段:执行ShadowCaster Pass生成光源空间深度
- 阴影比较阶段:通过_MainLightWorldToShadow矩阵转换坐标
- 最终混合阶段:根据阴影强度(Shadow Strength)混合光照结果
Shader示例展示阴影比较逻辑:
hlsl float4 shadowCoord = mul(_MainLightWorldToShadow, float4(worldPos, 1.0)); float shadow = SampleShadowmap(shadowCoord); // 采样ShadowMap float lightAttenuation = shadow > 0 ? 1.0 : 0.0; // 阴影判断 -
优化参数体系
| 参数 | 作用域 | 典型值 |
| --- | --- | --- |
| 分辨率 | 全局/光源级 | 1024-4096 |
| 级联分割 | 方向光 | 2-4级 |
| 深度偏移 | 材质/光源 | 0.001-0.1 |
| 法线偏移 | 材质/光源 | 0.01-0.5 | -
性能敏感操作
- 阴影距离(Shadow Distance):控制最大生成范围
- 软阴影滤波(Soft Shadows):增加PCSS滤波开销
- 动态批处理:影响ShadowCaster Pass执行效率
阴影贴图(Shadow Maps)
实现原理是从光源视角渲染场景深度到纹理(_MainLightShadowmapTexture),通过比较当前像素深度与ShadowMap值判断阴影区域。关键步骤包括:
- ShadowCaster Pass生成深度图,需声明LightMode="ShadowCaster"标签和对应宏
- 深度比较时使用_MainLightWorldToShadow矩阵转换坐标到光源空间
- 通过_ShadowBias参数调整深度/法线偏移防止阴影失真
阴影级联(Cascaded Shadow Maps)
将视锥体分割为多个区域(通常2×2图集),近处使用高精度贴图,远处使用低精度,解决大场景阴影锯齿问题。URP通过MainLightShadowCasterPass.cs管理级联:
- GetShadowCasterBounds()计算影响范围
- 不同级联区域对应_MainLightShadowmapTexture的不同部分
屏幕空间阴影(Screen Space Shadows)
替代传统级联的方案,工作流程:
- 生成_CameraDepthTexture和_MainLightShadowmapTexture
- 重建世界坐标后转换到阴影空间生成_ScreenSpaceShadowmapTexture
- 相比级联方案减少纹理采样次数但增加深度预处理开销
关键参数优化
| 参数 | 作用 | 示例 |
|---|---|---|
| 分辨率 | 影响阴影精度 | 2048x2048适合中端设备 |
| 图集 | 存储多级联/多光源阴影 | _MainLightShadowmapTexture为2×2图集 |
| 深度偏移 | 防止自阴影 | _ShadowBias.x调整深度值 |
| 法线偏移 | 解决Peter Panning | _ShadowBias.y沿法线偏移 |
| 近裁剪面 | 控制阴影生成范围 | Light组件中Cascade Split设置 |
技术对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 传统级联 | 精度可控 | 带宽占用高 |
| 屏幕空间 | 节省带宽 | 边缘锯齿明显 |
| 混合方案 | 平衡性能/质量 | 实现复杂度高 |
文档中特别强调:URP 14.1版本后优化了阴影图集分配策略,减少了约20%的显存占用。建议开发者通过Frame Debugger验证阴影生成各阶段的实际效果。
性能优化建议:
- 静态物体使用光照贴图烘焙阴影
- 动态物体根据距离调整阴影分辨率
- 屏幕空间阴影适合移动端(减少采样),PC端推荐级联阴影
- 硬阴影(Hard Shadow)比软阴影节省30% GPU开销
- 移动端适配
- 推荐使用屏幕空间阴影+中等分辨率(1024)
- 关闭非必要级联(如保留2级)
- 静态物体烘焙光照贴图
- PC端高精度方案
- 4级级联+2048分辨率
- 启用PCSS软阴影滤波
- 动态调整阴影距离(建议30-100米)
- 常见问题解决
- 阴影锯齿:提高分辨率或启用软阴影
- Peter Panning:增加法线偏移值
- 性能瓶颈:使用Debugger分析ShadowCaster耗时
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

URP 光照阴影 使用 阴影贴图 (Shadow Maps) 和 阴影级联 (Shadow Cascades)。屏幕空间阴影渲染器功能 (Screen Space Shadows Renderer F
浙公网安备 33010602011771号