级联阴影贴图
Cascaded Shadow Maps
级联阴影贴图 (CSM) 把视锥沿视线方向切成几段,每段用一张紧贴它的阴影贴图,使近处获得更多阴影纹素。它实现简单、能覆盖巨大场景、没有严重的最坏情况,因此被大量应用。关键问题是深度如何划分、近平面放在哪里、怎样避免抖动和级联边界的质量突变,以及如何降低多张贴图的开销。
来源
- 2004 年 Carmack 在 Quakecon 主题演讲中提出给观察者附近更多阴影样本;Blow 独立实现了围绕观察者嵌套四张阴影贴图。Forsyth 按可见物体集合分别生成阴影贴图(每个物体只属于一张,避免边界问题)。Flagship Studios 混合两者:近处动态物体一张(每帧生成)、附近静态物体网格区一张、整体静态物体一张(后两张可只生成一次)。
- 2006 年 Engel、Lloyd 等、Zhang 等独立提出按视线方向切分视锥:每段深度范围约为前一段的 2–3 倍,光源为每段生成紧包围的视锥和阴影贴图,用图集或纹理数组当作一个大纹理以减少缓存延迟。Engel 的名称 CSM 比 Zhang 的平行分割阴影贴图 (PSSM) 更常用,二者实际相同。
- 书中对比:单张 2048×2048 阴影贴图在宽阔场景中有透视混叠,沿视线放四张 1024×1024 明显改善。
- 对决视锥问题可通过近处更高采样率解决。
z 划分
- 对数划分:每级远近平面比相同,。例:最近 1 m、最远 1000 m、三级时 ,区间为 1–10、10–100、100–1000 m。初始近距离影响很大:若为 0.1 m,,区间为 0.1–2.154–46.42–1000,每张贴图覆盖更大区域、精度更低;且近平面附近分到大量分辨率,若那里没有物体就浪费了。
- 可用对数与等距划分的加权混合,但最好能确定场景的紧致视域边界。
- 近平面的挑战:放得太远物体会被裁掉,非常糟糕;过场中美术可预先设定。
- SDSM(样本分布阴影贴图):用上一帧深度确定划分。方法一:在 GPU 上用 reduce 操作求最小、最大深度作为近远平面(通常稍向外扩以应对移动;从屏幕边缘进入的近物体可能出错一帧,下一帧即修正)。方法二:建深度直方图,把划分面吸附到实际有物体的地方,跳过空隙。方法一通用、快(通常每帧约 1 ms)、效果好,已被多个应用采用。
抖动与边界
- 光源样本逐帧移动导致闪烁,物体在级联间移动时更严重;有多种保持世界空间样本点稳定的方法。
- 物体横跨两张贴图边界时质量突变:让视体稍微重叠并在重叠区混合两张贴图的结果,或用抖动 (dithering) 只取一个样本。
降低开销
- 阴影贴图视锥内无变化就不重算;预先为每个光源计算可见且可能投影到接收体上的投影物体列表。
- 阴影是否正确很难察觉,可走捷径:用低细节模型代理投影;剔除微小遮挡体;远级联低于每帧一次更新(大物体移动时可能出错,需谨慎);"滚动"远处贴图,只渲染边缘变化部分;《DOOM》(2016) 维护大阴影图集,只重新生成有物体移动的贴图;远级联忽略动态物体;某些环境中用高分辨率静态阴影贴图代替远级联;世界太大时用稀疏纹理;与烘焙光照贴图等其他技术结合。
- 单遍渲染到多张贴图:几何着色器复制物体到多个视图;实例化几何着色器可输出到最多 32 张深度纹理;多视口扩展可渲染到特定纹理数组切片。缺点是所有遮挡体都要送进管线,而不是只送与每张贴图相关的。
- 光源与遮挡剔除:视锥内但不可见的接收体,其遮挡体无需计算。Bittner 等用相机的遮挡剔除找到可见接收体,再从光源视角画入模板遮罩,生成阴影贴图时剔除没有接收体的区域。辐照度随距离平方衰减,常在超过阈值距离后剔除光源;门户剔除可确定哪些光影响哪些单元。
与滤波阴影的结合
级联可用于滤波阴影贴图以提高精度;级联 ESM 的优点是所有级联可用同一个偏移因子(见滤波阴影贴图)。
GPU Gems 的视角:平行分割阴影贴图 PSSM(GPU Gems 3 第 10 章)
来源:Zhang / Sun / Nyman《Parallel-Split Shadow Maps on Programmable GPUs》;摘录 Chapter 10. Parallel-Split Shadow Maps on Programmable GPUs — Zhang, Sun, Nyman。与上文 Engel CSM 同族:PSSM 是按视线平行平面切分视锥的正式算法名,RTR4 亦指出二者实质相同。
把阴影走样拆成透视走样 与投影走样 。后者依赖局部几何,贵;前者与场景无关,可用翘曲或分层逼近。对数分割让透视走样在深度上均匀,但近处分段往往短到几乎装不下物体;均匀分割则等价于标准阴影图的双曲走样。实用分割取二者加权:,默认 。生成前先收紧相机近远平面到可见物体,减少空视锥浪费分辨率。
光源矩阵可场景无关(切分视锥在光裁剪空间的 AABB,近 留 0 以免丢掉近光投射体)或场景相关(近平面与 贴投射体、远平面贴接收体)。合成时可用:多遍复用一张图;DX9 多纹理 + 按视空间 选级;DX10 纹理数组 + 几何着色器克隆/实例化一次提交投射体。过滤上可叠 PCF 或 VSM;还可在每级内再做 PSM/LiSPSM、各级不同分辨率、点光用线性深度。注意:作者在日夜周期游戏里试过透视/梯形全局阴影图,因太阳与视线夹角变化导致质量不稳,最终全局光改回大正交贴图——这与「级联比单一翘曲更稳」的工程判断一致。