实时阴影技术
2026/7/26大约 5 分钟
实时阴影技术 - Shadow Map、PCF 与 PCSS
引言:实时阴影的主流是 Shadow Mapping
实时阴影几乎都基于 Shadow Mapping(阴影贴图)。核心思想一句话:
从光源视角渲染一遍深度,记录"光能照到的最近距离";正式着色时,把像素变换到光源空间,比较它的深度与阴影贴图里的深度 —— 更远即在阴影中。
一、Shadow Map 基本流程
- ① 阴影 Pass:以光源为相机,只渲染深度,存入 Shadow Map。
- ② 主渲染:每个像素算出它在光源空间的深度,与 Shadow Map 中对应位置的深度比较。
二、经典瑕疵与对策
Shadow Map 是深度比较,受分辨率与精度限制,会产生几类典型瑕疵:
| 瑕疵 | 成因 | 对策 |
|---|---|---|
| 阴影痤疮(Shadow Acne) | 深度精度 + 自遮挡,表面自己给自己投影,出现摩尔纹/条纹 | 深度偏移(Depth Bias):比较时加一点偏移;Normal Offset、斜率偏移(Slope-Scaled Bias) |
| Peter-Panning(悬浮) | 偏移过大,阴影与物体脱离,像"悬空" | 偏移调小;或渲染阴影时用正面剔除(cull front) |
| 锯齿(走样) | Shadow Map 分辨率不足,一个纹素覆盖多像素 | 提高分辨率、CSM、软阴影滤波 |
| 投影走样(Perspective Aliasing) | 近处需要高分辨率但均匀分配不够 | CSM(按距离分级) |
痤疮 vs Peter-Panning 是一对矛盾:偏移太小有痤疮,太大有悬浮 —— 需要折中,斜率偏移能缓解。
三、软阴影:PCF 与 PCSS
硬阴影边缘是硬的锯齿边;真实阴影有半影(penumbra),需要软化。
PCF(Percentage-Closer Filtering)
对 Shadow Map 在比较之后做多点采样取平均:采样阴影贴图周围多个纹素、各自做深度比较,再平均"在阴影中的比例" → 边缘柔和。
硬阴影:单次比较 → 0 或 1(硬边)
PCF: 周围 N×N 次比较 → 平均比例(柔和边)- 采样核越大越软,但开销越高。
- 注意是"先比较再平均",不能直接平均深度值。
PCSS(Percentage-Closer Soft Shadows)
模拟真实的可变半影(靠近遮挡物阴影硬、远离软):
- Blocker Search:估计遮挡物平均深度。
- Penumbra 估算:由光源大小、遮挡物与接收面距离,算出半影宽度。
- 可变核 PCF:按半影宽度动态调整 PCF 采样核。
效果更真实,但开销明显高于固定 PCF。
四、级联阴影贴图(CSM / CSSM)
平行光(太阳)覆盖整个视锥,单张 Shadow Map 分辨率远远不够 —— 近处糊、远处浪费。CSM 的解法:
把相机视锥按距离分成若干段(级联),每段用独立的 Shadow Map,近处段覆盖范围小、分辨率高,远处段覆盖大、分辨率低。

- 常用 3~4 级级联。
- 分割方式:对数分割、均匀分割,或两者混合(PSSM 实用分割)。
- 级联接缝:相邻级联过渡处可能有跳变,用混合过渡带平滑。
- 收益:把有限的阴影贴图分辨率"按需分配"给近处 —— 近处清晰、远处够用。
五、其它阴影技术(简述)
| 技术 | 思路 |
|---|---|
| VSM(Variance Shadow Map) | 存深度与深度平方,用切比雪夫不等式估阴影比例,天然可滤波(可做软阴影),但有漏光(light bleeding) |
| ESM(Exponential Shadow Map) | 用指数函数近似,减轻痤疮、可滤波 |
| 点光/聚光阴影 | 点光用 Cube Shadow Map(六面);聚光用透视 Shadow Map |
| 接触阴影(Contact Shadow) | 屏幕空间光线步进补足小尺度接触阴影 |
| 光线追踪阴影 | 直接对光源投射光线,物理精确、软硬自然,但开销高(需 RT 硬件 + 降噪) |
六、性能与实践
- 阴影 Pass 是常见的 GPU 开销大户(性能分析里"阴影 Pass 重"那条)。优化点:
- 控制 Shadow Map 分辨率与级联数。
- 限制投射阴影的物体(远处/小物体不投)。
- 阴影距离(Shadow Distance)不要过大。
- 移动端谨慎用高分辨率 + 多级联(带宽/填充率)。
- 阴影与 PBR 光照在光照 Pass 中结合(可见性作为直接光的遮蔽项)。
七、核心概念速查
| 概念 | 说明 |
|---|---|
| Shadow Map | 从光源视角渲染深度,比较深度判断阴影 |
| Shadow Acne | 自遮挡条纹,用 Depth/Normal/Slope Bias 缓解 |
| Peter-Panning | 偏移过大导致阴影悬浮 |
| PCF | 多点深度比较取平均,柔化边缘 |
| PCSS | 可变半影软阴影(Blocker Search + 可变核) |
| CSM | 按视锥距离分级,多张 Shadow Map 各管一段 |
| VSM/ESM | 可滤波阴影,支持软阴影,注意漏光 |
| Cube Shadow Map | 点光源的六面阴影贴图 |
总结
- Shadow Map 是实时阴影的事实标准,核心思路是从光源视角渲染深度并作逐像素深度比较。
- 经典瑕疵包括阴影痤疮、Peter-Panning 悬浮、锯齿和投影走样,分别通过深度偏移、正面剔除、CSM 等方式缓解。
- PCF 通过对阴影贴图多点采样并平均比较结果来生成软阴影边缘;PCSS 在此基础上加入可变半影估算,效果更真实。
- CSM 将视锥按距离分级,为近处分配更高分辨率的阴影贴图,是平行光阴影的关键优化手段。
- VSM、ESM、光线追踪阴影等技术在特定场景下各有优劣,需根据性能与质量需求权衡选择。
