中EN
概念页

级联阴影贴图

Cascaded Shadow Maps

更新于 2026-10-15 约 5 分钟阴影CSM级联SDSM

级联阴影贴图 (CSM) 把视锥沿视线方向切成几段,每段用一张紧贴它的阴影贴图,使近处获得更多阴影纹素。它实现简单、能覆盖巨大场景、没有严重的最坏情况,因此被大量应用。关键问题是深度如何划分、近平面放在哪里、怎样避免抖动和级联边界的质量突变,以及如何降低多张贴图的开销。

来源

  • 2004 年 Carmack 在 Quakecon 主题演讲中提出给观察者附近更多阴影样本;Blow 独立实现了围绕观察者嵌套四张阴影贴图。Forsyth 按可见物体集合分别生成阴影贴图(每个物体只属于一张,避免边界问题)。Flagship Studios 混合两者:近处动态物体一张(每帧生成)、附近静态物体网格区一张、整体静态物体一张(后两张可只生成一次)。
  • 2006 年 Engel、Lloyd 等、Zhang 等独立提出按视线方向切分视锥:每段深度范围约为前一段的 2–3 倍,光源为每段生成紧包围的视锥和阴影贴图,用图集或纹理数组当作一个大纹理以减少缓存延迟。Engel 的名称 CSM 比 Zhang 的平行分割阴影贴图 (PSSM) 更常用,二者实际相同。
  • 书中对比:单张 2048×2048 阴影贴图在宽阔场景中有透视混叠,沿视线放四张 1024×1024 明显改善。
  • 对决视锥问题可通过近处更高采样率解决。

z 划分

  • 对数划分:每级远近平面比相同,r=f/ncr=\sqrt[c]{f/n}。例:最近 1 m、最远 1000 m、三级时 r=10r=10,区间为 1–10、10–100、100–1000 m。初始近距离影响很大:若为 0.1 m,r=100003=21.54r=\sqrt[3]{10000}=21.54,区间为 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 亦指出二者实质相同。

把阴影走样拆成透视走样 dz/(z ds)dz/(z\,ds) 与投影走样 cos⁡ϕ/cos⁡θ\cos\phi/\cos\theta。后者依赖局部几何,贵;前者与场景无关,可用翘曲或分层逼近。对数分割让透视走样在深度上均匀,但近处分段往往短到几乎装不下物体;均匀分割则等价于标准阴影图的双曲走样。实用分割取二者加权:Ci=λCilog⁡+(1−λ)CiuniC_i=\lambda C^{\log}_i+(1-\lambda)C^{\mathrm{uni}}_i,默认 λ=0.5\lambda=0.5。生成前先收紧相机近远平面到可见物体,减少空视锥浪费分辨率。

光源矩阵可场景无关(切分视锥在光裁剪空间的 AABB,近 zz 留 0 以免丢掉近光投射体)或场景相关(近平面与 xyxy 贴投射体、远平面贴接收体)。合成时可用:多遍复用一张图;DX9 多纹理 + 按视空间 zz 选级;DX10 纹理数组 + 几何着色器克隆/实例化一次提交投射体。过滤上可叠 PCF 或 VSM;还可在每级内再做 PSM/LiSPSM、各级不同分辨率、点光用线性深度。注意:作者在日夜周期游戏里试过透视/梯形全局阴影图,因太阳与视线夹角变化导致质量不稳,最终全局光改回大正交贴图——这与「级联比单一翘曲更稳」的工程判断一致。

  1. realtime_rendering_4ed.pdf 第 7 章 Shadows
  2. Chapter 10. Parallel-Split Shadow Maps on Programmable GPUs — Zhang, Sun, Nyman
  3. developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-10-parallel-split-shadow-maps-programmable-gpus

相关页面

图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学滤波阴影贴图Filtered Shadow Maps普通阴影贴图的深度不能直接过滤。滤波阴影贴图存的是深度的某种统计量(矩、指数),可以像普通纹理一样模糊、做 mipmap、用求和面积表,只取一个样本就能得到平滑的半影。代表方法有方差阴影贴图 (VSM)、卷积阴影贴图、指数阴影贴图 (ESM/EVSM) 和矩阴影贴图;共同难点是漏光。图形学软阴影 PCF 与 PCSSSoft Shadows with PCF & PCSS百分比渐近过滤 (PCF) 在阴影贴图上取多个样本,分别与表面深度比较后混合结果,得到伪软阴影,但半影宽度恒定。PCSS 先搜索附近遮挡体的平均深度,再据此决定过滤宽度,从而在接触处硬、远处软(接触硬化)。游戏开发 · UE5虚拟阴影贴图Virtual Shadow Maps虚拟阴影贴图 (Virtual Shadow Maps, VSM) 是 UE5 默认的阴影方法:概念上就是分辨率极高(虚拟 16k×16k)的阴影贴图,切成 128×128 的页 (Page),只为屏幕上需要着色的像素分配和渲染页,并跨帧缓存;方向光用 clipmap 覆盖大范围,软阴影由阴影贴图光线追踪 (Shadow Map Ray Tracing, SMRT) 生成。它为 Nanite 设计,与 Nanite 一起使用时最高效。图形学粒子系统Particle Systems粒子系统是一组按某种算法运动的小物体,用于火、烟、爆炸、水流、星系等,同时负责动画(生成、移动、变化、删除)和渲染。粒子通常渲染成公告板;难点在半透明排序、光照(逐顶点、逐像素低分辨率光照图块)以及接收/投射/自阴影(透射率溅射、傅里叶不透明度贴图、消光体积)(RTR4 13.8 节)。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。游戏开发 · UE5天空大气与体积云Sky Atmosphere & Volumetric Clouds天空大气 (Sky Atmosphere) 组件是基于物理的天空与大气渲染:模拟瑞利散射 (Rayleigh)、米氏散射 (Mie) 和臭氧吸收,天色随太阳高度变化,并提供带行星曲率的空气透视,可以从地面平滑过渡到外太空。体积云 (Volumetric Cloud) 组件用材质驱动的三维体积纹理做光线步进,多次散射用若干「八度」近似,云的阴影可以用光线步进或 Beer 阴影贴图。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原