中EN
概念页

滤波阴影贴图

Filtered Shadow Maps

更新于 2026-10-15 约 6 分钟阴影VSMESMEVSM矩阴影贴图

普通阴影贴图的深度不能直接过滤。滤波阴影贴图存的是深度的某种统计量(矩、指数),可以像普通纹理一样模糊、做 mipmap、用求和面积表,只取一个样本就能得到平滑的半影。代表方法有方差阴影贴图 (VSM)、卷积阴影贴图、指数阴影贴图 (ESM/EVSM) 和矩阴影贴图;共同难点是漏光。

方差阴影贴图 (VSM)

  • 一张图存深度,另一张存深度平方;生成时可用 MSAA 等抗锯齿,之后可模糊、mipmap、放进求和面积表,所有纹理采样过滤手段都能用。
  • 在接收体位置采样一次得到平均遮挡深度 M1M_1(一阶矩)。M1M_1 大于接收体深度 tt 时完全受光;否则: pmax⁡(t)=σ2σ2+(t−M1)2,σ2=M2−M12p_{\max}(t)=\frac{\sigma^2}{\sigma^2+(t-M_1)^2},\qquad \sigma^2=M_2-M_1^2 M2M_2 为二阶矩。pmax⁡p_{\max} 是受光百分比的上界(来自单侧切比雪夫不等式)。对固定深度的平面遮挡体和平面接收体,p=pmax⁡p=p_{\max},所以它是许多实际情况的好近似。
  • 直观理解:阴影边缘处方差增大;在半影受光边,平均遮挡深度只比接收体略近,pmax⁡p_{\max} 接近 1;进入半影后 (t−M1)2(t-M_1)^2 变大、pmax⁡p_{\max} 下降,同时方差从边缘近 0 变到遮挡体深度不同且平分面积处最大,两者平衡得到线性变化的阴影。
  • 优点:能用表面斜率修改二阶矩,优雅地处理几何偏移问题。数值上 M2−M12M_2-M_1^2 是两个相近大数相减,会放大精度不足,应使用浮点纹理。
  • 性价比高:PCF 要更多样本才能在软阴影中避免噪声,VSM 一个高质量样本就能得到平滑半影,在算法限度内阴影可以任意软而不增加开销。
  • 与 PCF 一样,过滤核宽度决定半影宽度;求出接收体到最近遮挡体的距离即可改变核宽。mipmap 对缓慢增宽的半影估计很差,会出现方块伪影;求和面积表效果好得多。

漏光 (light bleeding)

  • 两个及以上遮挡体覆盖接收体且其中一个离接收体很近时,切比雪夫不等式给出的最大值与真实受光比例无关,完全遮挡的区域仍有光。用更多更小区域的样本可以解决,但 VSM 就变成了一种 PCF。
  • Lauritzen 的美术可控方法:把低百分比视为全阴影,其余重映射到 0%–100%,以变窄半影为代价压暗漏光。
  • 阴影深度复杂度低的场景 VSM 效果好;地形阴影很少有多重遮挡,很适合 VSM。

卷积阴影贴图

把阴影深度编码为傅里叶展开,可过滤且收敛到正确答案,漏光较少;但要计算和访问多项,执行和存储开销都显著增加;还存在振铃:在原遮挡体深度稍后的特定深度出现轻微漏光。

指数阴影贴图 (ESM / EVSM)

  • Salvi 与 Annen 等独立提出用指数函数的单项:把深度的指数及其二阶矩存入两个缓冲。指数函数更接近阴影测试的阶跃函数,显著减少漏光,也避免振铃。
  • 局限:指数值的二阶矩可能极大,超出浮点范围;生成线性 z 深度可提高精度,并让指数衰减更陡。
  • 质量好于 VSM,存储和性能优于卷积阴影贴图,是三者中最受关注的。还可用 MSAA 改善结果、得到有限的透明效果,用计算着色器提升过滤性能。
  • 级联 ESM 相比标准级联贴图,所有级联可用一个偏移因子;但也有各种漏光等伪影需要处理。

矩阴影贴图

Peters 和 Klein 提出,用四个或更多矩,质量更好但存储更大,可用 16 位整数存储降低开销。其扩展还能提供光散射和透明效果。

定位

滤波阴影贴图可以看作样本很少的廉价 PCF,同样半影宽度恒定;都可与 PCSS 结合实现可变宽度半影。书中总结:滤波阴影贴图提供快速软阴影计算,在遮挡体远离接收体时(如地形)尤其好用。

方法存储优点缺点
VSM深度 + 深度²可任意过滤,单样本软阴影多遮挡体漏光,精度问题
卷积多个傅里叶项收敛到正确答案开销大,振铃
ESM/EVSM指数深度 + 二阶矩漏光少,性价比最好数值溢出,需线性深度
矩阴影≥4 个矩质量更好存储更大

GPU Gems 的视角:求和面积方差阴影贴图 SAVSM(GPU Gems 3 第 8 章)

来源:Andrew Lauritzen《Summed-Area Variance Shadow Maps》;摘录 Chapter 8. Summed-Area Variance Shadow Maps — Andrew Lauritzen。与上文 RTR4 的 VSM/ESM/MSM 并列:本章给出 VSM 落地细节、漏光压制与按像素可变核宽。

VSM 把深度当成可线性滤波的分布:阴影图写深度与深度平方,过滤后恢复一阶、二阶矩,再用单侧切比雪夫不等式给出受光概率上界 pmax⁡p_{\max}。对「单一平面遮挡体 + 单一平面接收体」该上界等于真实 PCF 结果,因此在许多游戏场景中可直接当可见性用。最小方差要夹到极小正数,既防数值炸掉,也常能顺手消掉粉刺。

偏置方面,Lauritzen 用片元深度的 ddx/ddyddx/ddy 把每个纹素建成局部平面分布,把斜率写进二阶矩,而不是靠恒定深度偏置——多边形几乎平行于光线时也不必把彼得潘拉得很大。漏光(半影同时出现在本该全暗的第二接收面上)无法在任意遮挡分布下彻底消除,但可用 linstep(Amount, 1, p_max)(或 smoothstep)砍掉低强度假半影再重映射,Amount 与场景尺度无关,调到刚好去掉最刺眼漏光即可。

深度度量强烈建议用到光源的线性距离(方向光则用到光平面的距离),而不是透视除法后的 zz;否则方差是两个大数相减,精度一丢画面就花。实现上还可对阴影图开 MSAA、可分离盒模糊当最小核宽、再生成 mip,着色时一次各向异性采样即可。注意:接收体必须写进方差图,否则半影尺度会错;「只画投射体 / second-depth」那套传统偏置技巧与 VSM 不兼容。

当半影宽度要随遮挡距离逐像素变化(与 软阴影 PCF 与 PCSS 的 PCSS 同路)时,固定模糊不够。本章把 VSM 放进求和面积表 (SAT):任意矩形区域的矩平均 O(1)O(1) 可取,核宽可动态。代价是 SAT 吃掉约 log⁡(W×H)\log(W\times H) 位精度,需用均值偏置、把矩拆到四通道、原点居中 SAT、或已知最大核时用整数环绕累加等手段保住有效位数。经验上最小核宽至少约 4 才能压住最扎眼的阴影锯齿;固定核宽时「模糊 VSM + 漏光压制」通常比 SAVSM 更便宜,动态核宽才轮到 SAVSM。

  1. realtime_rendering_4ed.pdf 第 7 章 Shadows
  2. Chapter 8. Summed-Area Variance Shadow Maps — Andrew Lauritzen
  3. developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-8-summed-area-variance-shadow-maps

相关页面

图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学软阴影 PCF 与 PCSSSoft Shadows with PCF & PCSS百分比渐近过滤 (PCF) 在阴影贴图上取多个样本,分别与表面深度比较后混合结果,得到伪软阴影,但半影宽度恒定。PCSS 先搜索附近遮挡体的平均深度,再据此决定过滤宽度,从而在接触处硬、远处软(接触硬化)。图形学级联阴影贴图Cascaded Shadow Maps级联阴影贴图 (CSM) 把视锥沿视线方向切成几段,每段用一张紧贴它的阴影贴图,使近处获得更多阴影纹素。它实现简单、能覆盖巨大场景、没有严重的最坏情况,因此被大量应用。关键问题是深度如何划分、近平面放在哪里、怎样避免抖动和级联边界的质量突变,以及如何降低多张贴图的开销。图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学毛发渲染Hair & Fur Rendering毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。图形学粒子系统Particle Systems粒子系统是一组按某种算法运动的小物体,用于火、烟、爆炸、水流、星系等,同时负责动画(生成、移动、变化、删除)和渲染。粒子通常渲染成公告板;难点在半透明排序、光照(逐顶点、逐像素低分辨率光照图块)以及接收/投射/自阴影(透射率溅射、傅里叶不透明度贴图、消光体积)(RTR4 13.8 节)。图形学体素Voxels体素是"体积元素",表示均匀三维网格中的一块空间,位置由网格索引隐含。体素是存储体积数据的传统方式,可存占用位、密度、颜色、法线、有向距离等。数据量按分辨率立方增长,常用稀疏体素八叉树 (SVO) 等结构压缩;可由 GPU 体素化生成,并通过光线投射、转多边形、移动立方体或等值面/水平集光线追踪来渲染(RTR4 13.10 节)。

输入关键词开始搜索

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