阴影贴图

义项:实时阴影渲染技术
阴影贴图

阴影贴图是实时三维图形渲染中用于生成阴影的一种技术,其做法是先从光源视角渲染场景得到一张记录深度信息的纹理,再在主渲染阶段把每个像素变换到光源坐标系中与该深度比较,从而判断该点是否被遮挡。它由兰斯·威廉姆斯(Lance Williams)于 1978 年提出,因为可以直接复用图形硬件已有的深度计算与光栅化流程,成为游戏、影视特效、建筑可视化等交互式应用中应用最广的阴影算法之一。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

阴影贴图是一种把阴影加入三维计算机图形的过程,也称阴影映射或阴影投影。其核心是判断某个像素从光源方向看是否可见:把该像素与光源视角下保存的深度图像作比较,若像素比深度图中记录的表面更远离光源,说明它与光源之间存在遮挡物,应被判定为处于阴影中[1]。

它属于基于图像的阴影方法,输出结果是一张纹理而非几何体。IEEE 的技术词条将阴影贴图定义为一种用于三维计算机图形的实时渲染技术,通过比较预计算纹理中的深度值与每个渲染像素的深度,判断某点是被光源照亮还是被中间几何体遮挡,并指出它能在动态光照条件下以足够低的计算开销生成可信的阴影,适用于电子游戏和仿真软件等交互式应用[2]。

原理

阴影贴图的渲染分为两个主要步骤。第一步以光源为视点渲染整个场景,只记录深度而不计算颜色、光照和纹理,得到一张二维深度图,即阴影贴图;对方向光这样来自无穷远处的光源应使用正交投影,对点光源则需要覆盖六个方向的立方体贴图[1][2]。

第二步从正常摄像机视角绘制场景,把每个片元的位置经矩阵变换到光源的坐标系,其 x、y 分量对应深度图中的纹理位置,z 分量即该片元到光源的距离。若片元深度大于深度图中存储的值,说明光源与它之间还有更近的表面,该片元被判定为处于阴影;两者近似相等则认为被照亮[3]。

用公式表示,设深度图中该位置记录的最近表面深度为 $A$,片元在光源空间中的深度为 $B$,则当 $B > A + b$ 时片元处于阴影,其中 $b$ 为偏移量。偏移用于抵消浮点精度限制引起的自阴影瑕疵,但取值需谨慎:过大会使阴影与投射物分离,出现被称为彼得潘现象的可见错误[2]。

对应的判定逻辑可用伪代码概括:从光源位置渲染得到深度图,再对每个片元执行投影与深度比较,输出受光或被遮挡的二值结果,并以此调制最终光照。该过程通常需要每帧两次绘制,每增加一个光源就要多一张阴影贴图;当光源和场景都不变化时,深度图可以复用[3]。

发展历程

兰斯·威廉姆斯在 1978 年的论文《在曲面上投射弯曲阴影》中提出了这一方法,用于借助 Z 缓冲的可见面计算,让由光滑曲面片构成的物体投射阴影。论文指出,为每个光源确定阴影的开销大致是在无阴影情况下渲染场景的两倍,外加一项与图像分辨率有关的固定变换开销[4]。在此之前的阴影算法大多只适用于由平面多边形构成的场景[4]。

1987 年,里夫斯等人提出百分比邻近过滤,把深度比较的布尔结果在其邻域内求平均,以缓解边缘走样并生成类似半影的柔和边界[5]。这一思路后来成为阴影图滤波的基础,并被图形硬件直接支持[6]。

2001 年,康奈尔大学的费尔南多等人提出自适应阴影贴图,通过判断人眼视角像素在阴影图中的投影面积,对深度差异大的区域逐级细分与细化,并用层次网格结构存储,从而缓解走样[5]。2002 年,斯塔明格与德雷塔基斯提出透视阴影贴图,在规范化设备坐标中生成阴影图,使靠近摄像机的物体获得更高有效分辨率[5]。

2006 年,唐纳利与劳里岑提出方差阴影贴图,在深度之外额外存储深度的平方,使阴影图能够像普通纹理一样预滤波,并借助切比雪夫不等式估计受光比例。级联阴影贴图则把视锥体沿深度切分成多个子视锥,各自使用一张阴影图,是应对透视走样的常用方案[6]。

应用

阴影贴图的主要应用是消费级图形硬件上的实时电子游戏渲染,此外也用于影视视觉特效制作、建筑可视化与虚拟漫游、飞行模拟与军事训练环境,以及增强现实和混合现实显示系统[2]。

在具体引擎实现中,Unity 从光源角度生成阴影贴图,其方式与摄像机生成深度纹理类似,并填充光线射到表面之前传播距离的信息,再对阴影贴图采样以计算实时阴影[7]。虚拟阴影贴图是一种由 GPU 驱动的实时阴影渲染技术,它预分配固定大小的物理纹理并划分为 128×128 的物理页,同时为光源提供若干高分辨率虚拟页,只渲染当前帧需要的页[8]。

除实时渲染外,阴影贴图的思路也被推广到其他表示形式。有专利方案把三维高斯泼溅模型转换为目标网格模型并作为遮罩投影出阴影图,再结合该模型渲染目标图像,用于处理半透明对象的阴影[9]。

局限

阴影贴图的精度受分辨率限制,这是它的固有弱点。当大量人眼视角像素投影到阴影图中同一纹素时会产生透视走样,出现块状阶梯状瑕疵;反之若阴影图相对过大则表现为欠采样,纹素被跳过并引起闪烁[1][6]。提高分辨率可以缓解,但受内存、计算或硬件条件约束,并不总能实现[1]。

深度缓冲的数值精度不足会在明暗交界附近产生可见瑕疵,通常用深度偏移或只渲染背面多边形来缓解[5]。偏移量存在取舍:过小会出现散斑状自阴影,过大则阴影从投射物上脱开[3]。

单片阴影图无法同时以高分辨率覆盖宽广的视锥体,因此大型室外场景需要级联等拆分方案;相邻级联之间分辨率不匹配还会产生可见接缝,需要在重叠带内对两次阴影测试结果作线性插值[6]。此外,单次比较得到的是硬阴影,要模拟面光源的柔和边界需额外处理,例如调制过滤半径或采用预滤波的方差阴影贴图[2]。

滤波方法本身也有代价。百分比邻近过滤要为每个片元在核窗口内多次采样,核越大开销增长越快,且基本形式下强度分级数量有限[10]。方差阴影贴图虽然可以预滤波,但在多个遮挡物相互重叠的边缘会出现光渗现象,一种部分缓解办法是提高估计出的受光比例的次数。

参见

  • 阴影体 —— 另一种基于几何的阴影技术,不需要额外模板缓冲以外的精度限制,但开销随几何复杂度增长

  • 百分比邻近过滤 —— 对阴影图深度比较结果作邻域平均的滤波方法,用于缓解走样并柔化边界

  • 方差阴影贴图 —— 在阴影图中额外存储深度平方、支持预滤波的阴影贴图变体

  • 级联阴影贴图 —— 把视锥体切分为多个子视锥并各自生成阴影图,用于缓解透视走样

  • 光线追踪 —— 通过投射阴影射线判断遮挡的离线与实时渲染方法

  • 三维计算机图形 —— 阴影贴图所服务的学科领域

参考资料

  1. Shadow_Maps [引用日期2026-10-14]
  2. Shadow mapping | IEEE Technology Navigator [引用日期2026-10-14]
  3. Lecture 14: Many Lights [引用日期2026-10-14]
  4. acm.org 上的网页 [引用日期2026-10-14]
  5. Let04(PDF) [引用日期2026-10-14]
  6. 级联阴影映射 - 跳至主要内容 跳到 Ask Learn 聊天体验 [引用日期2026-10-14]
  7. Unity 手册 [引用日期2026-10-14]
  8. 团结引擎 [引用日期2026-10-14]
  9. CN120198616A [引用日期2026-10-14]
  10. GameDevelopers [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T19:58:48Z

历史版本

本条目引用的词条
阴影体 百分比邻近过滤 方差阴影贴图 级联阴影贴图 光线追踪 三维计算机图形