中EN
概念页

软阴影 PCF 与 PCSS

Soft Shadows with PCF & PCSS

更新于 2026-10-16 约 8 分钟阴影软阴影PCFPCSSCHS

百分比渐近过滤 (PCF) 在阴影贴图上取多个样本,分别与表面深度比较后混合结果,得到伪软阴影,但半影宽度恒定。PCSS 先搜索附近遮挡体的平均深度,再据此决定过滤宽度,从而在接触处硬、远处软(接触硬化)。

PCF

  • 类似纹理放大:取最近四个样本,不插值深度本身,而是插值比较结果(阴影 0、受光 1),得到人为的软边。半影随阴影贴图分辨率、相机位置等变化,分辨率越高软边越窄。有一点半影和平滑总比没有好,也能缓解阴影块状感。
  • 物理上,面光源下某点的受光量取决于从该点能看到多少光源面积。PCF 把过程反过来:对点光源/方向光,在原位置附近一组表面位置(深度相近、纹素不同)上检查可见性,求可见样本的百分比。这是非物理的,到遮挡体的距离不影响结果,所以半影大小都相似,但在许多情况下是合理近似。
  • 采样变量:区域宽度、样本数、样本图案、权重。老 API 中有类似双线性的特殊采样模式,比较四个邻居后返回通过比例;DirectX 10 引入了单指令双线性 PCF。
  • 规则网格最近邻采样会出现明显伪影;可用尊重物体边缘的联合双边滤波模糊。预计算泊松分布图案让样本既不靠近也不规则;每像素使用相同样本位置仍会出图案,逐像素随机旋转样本分布可把混叠变成噪声。Castaño 发现泊松噪声在平滑风格化内容上特别明显,提出基于双线性采样的高效高斯加权方案。

PCF 的偏移问题

  • PCF 会加重痤疮和 Peter Panning:斜率偏移假设样本离原位置不超过一个纹素,而大范围采样时部分样本会被真实表面挡住。
  • 偏移锥 (Burley):每个样本按离原样本的距离向光源移动,推荐斜率 2.0 加少量常数偏移。
  • 接收平面深度偏移:用接收体自身的斜率调整其他样本深度,假设邻近样本在三角形平面上;Tuft 的公式最容易用于级联阴影。凸表面上很精确,但凹处样本会被挡住。
  • 常数、斜率、接收平面、视线方向和法线偏移常组合使用,仍可能需要针对每个环境手调。

PCSS (Fernando, 2005)

  • 在阴影贴图附近区域搜索所有可能的遮挡体,用平均遮挡体距离决定采样宽度: wsample=wlightdr−dodrw_{\text{sample}}=w_{\text{light}}\frac{d_r-d_o}{d_r} drd_r 为接收体到光源距离,dod_o 为平均遮挡体距离。遮挡体离接收体越远、离光源越近,采样区域越宽。
  • 没找到遮挡体则完全受光、完全被遮挡也可提前结束;否则再采样估计光照贡献。可按采样宽度调整样本数,远处软阴影可用更低采样率。
  • 缺点:搜索遮挡体要采样相当大的区域。旋转泊松盘可隐藏欠采样;Jimenez 发现泊松采样在运动下不稳定,用介于抖动与随机之间的函数生成的螺旋图案逐帧更稳定。
  • 基本 PCSS 的半影大小还受阴影贴图分辨率影响。

CHS 与加速

  • 接触硬化阴影 (CHS):AMD 用 SM 5.0 特性的更快 PCSS 实现。先生成阴影贴图的 mipmap,选与用户定义的世界空间核大小最接近的 mip 层;8×8 区域找平均遮挡深度只需 16 次 GatherRed();锐利区域用高分辨率 mip,较软区域用低分辨率 mip。已被大量游戏使用。
  • 可分离软阴影贴图 (SSSM):把 PCSS 网格采样拆成可分离部分,并尽量在像素间复用。
  • 分层 min/max 阴影贴图:深度不能平均,但可以建两套 mipmap 分别存每块区域的最大深度(有时叫 HiZ)和最小深度,快速判断完全受光或完全阴影;例如纹素深度大于该区域最大深度,则必在阴影中,无需更多样本。

局限

  • PCF、PCSS 都不直接考虑光源面积,而是采样附近表面,并受阴影贴图分辨率影响。
  • PCSS 的主要假设是平均遮挡体能合理估计半影大小。两个遮挡体(如路灯和远山)同时部分遮挡一个像素时这个假设失效,产生伪影。例如《The Division》中树枝阴影与箱子角重叠时 PCSS 出错,与 IZB 硬阴影混合后改善。
  • 反投影方法把接收点当视点、把面光源当视平面,将遮挡体投影上去,结果很好,但每像素开销高,至今未被交互应用采用。

对比

方法半影主要代价/问题
PCF宽度恒定软阴影需要更多样本;接触处不真实
PCSS随遮挡体距离变化遮挡体搜索开销;多遮挡体时出错
CHS同上,减轻分辨率影响需要阴影贴图 mipmap

LearnOpenGL 的视角:教学用邻域 PCF(Shadow Mapping / Point Shadows)

来源:同章 Shadow Mapping、Point Shadows 末节。

方向阴影:在投影 UV 上对 depth map 做固定核(如 3×3)先比较后平均。点阴影:在立方体方向上采样偏移。这是「先比较后过滤」的入门形态;产品级可变核、遮挡物搜索与接触硬化见上文 PCSS。与 级联阴影贴图、虚拟阴影贴图(UE)衔接时,PCF 仍是各 cascade/页的基础软边手段。

GPU Gems 的视角:PCSS 的过滤步用 SAVSM 加速(GPU Gems 3 第 8 章)

来源:同 Lauritzen 第 8 章 8.6 节;摘录见 Chapter 8. Summed-Area Variance Shadow Maps — Andrew Lauritzen。与上文 Fernando PCSS 流程对照。

PCSS 三步(遮挡搜索 → 相似三角形估计半影 → 过滤)里,过滤步原本是均匀网格 PCF。把该步换成求和面积方差阴影贴图后,任意矩形核恒定开销,大核软阴影不再随核宽线性变贵。遮挡搜索仍要对阴影图做深度比较,会把 PCF 时代的偏置问题重新带回来,也仍是整条管线的瓶颈之一;但在同等 64 次遮挡采样的困难场景里,作者测得 SAVSM 版约 40 FPS、PCF 版约 25 FPS(1600×1200),且稀疏 PCF 采样质量更差。结论:SAVSM 很适合嵌进「可变核宽软阴影」;固定核宽则优先普通模糊 VSM。

GPU Gems 的视角:分支自适应软边阴影(GPU Gems 2 第 17 章)

来源:Yury Uralsky《Efficient Soft-Edged Shadows Using Pixel Shader Branching》;摘录 Chapter 17. Efficient Soft-Edged Shadows Using Pixel Shader Branching — Yury Uralsky。单张阴影图 + 片元动态分支上的分层抖动 PCF,GeForce 6 时代把软边做进实时。

不模糊深度,而模糊比较结果。固定偏移 PCF 在大半影出条带;分层抖动(方格 strata → 保面积圆盘映射)把误差变成高频噪声。3D jitter 图:屏幕分块 (s,t)(s,t)、沿 rr 存不同偏移序列,每 texel 塞两对偏移。

关键优化:先在圆盘外环取少量估计样本;若全 0 或全 1(且 N⋅L>0N\cdot L>0)则跳过剩余采样——大半影外像素几乎免费。分支局部一致性决定并行 GPU 收益;背面阴影图 + N⋅L≤0N\cdot L\le0 抑制粉刺假半影。硬件双线性 PCF 免费叠加。相对固定 64 样本可 >2×。非物理面光源半影;透视阴影图等非常规投影需每像素调半影尺寸。与后文 PCSS / SAVSM 对照:本章是「分支省样本的经典 PCF」,PCSS 加接触硬化,SAVSM 走矩/卷积。

GPU Gems 的视角:阴影图抗锯齿与经典 PCF(GPU Gems 1 第 11 章)

来源:Bunnell & Pellacini《Shadow Map Antialiasing》;摘录 Chapter 11. Shadow Map Antialiasing — Michael Bunnell & Fabio Pellacini。不能预过滤深度,只能平均多次比较——实时 PCF 的奠基表述。

相对 REYES 随机微多边形区域,本章固定用约 4×44\times4 texel 核。NVIDIA 硬件一次给出 2×22\times2 双线性 PCF;扩到 4×44\times4 需 16 次比较。屏幕相关 4 样本抖动子集(从 16 里挑)用抖动换灰度,质量接近、开销约 1/4。固定核在投影放大时仍有效,因邻像素滤波重叠会再平均。后续 Gems2 Ch17 在此之上加分支与分层抖动半影。

  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
  4. Chapter 17. Efficient Soft-Edged Shadows Using Pixel Shader Branching — Yury Uralsky
  5. developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-17-efficient-soft-edged-shadows-using
  6. Advanced Lighting — Shadow Mapping
  7. Advanced Lighting — Point Shadows
  8. Chapter 11. Shadow Map Antialiasing — Michael Bunnell & Fabio Pellacini
  9. developer.nvidia.com/gpugems/gpugems/part-ii-lighting-and-shadows/chapter-11-shadow-map-antialiasing

相关页面

图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学滤波阴影贴图Filtered Shadow Maps普通阴影贴图的深度不能直接过滤。滤波阴影贴图存的是深度的某种统计量(矩、指数),可以像普通纹理一样模糊、做 mipmap、用求和面积表,只取一个样本就能得到平滑的半影。代表方法有方差阴影贴图 (VSM)、卷积阴影贴图、指数阴影贴图 (ESM/EVSM) 和矩阴影贴图;共同难点是漏光。图形学级联阴影贴图Cascaded Shadow Maps级联阴影贴图 (CSM) 把视锥沿视线方向切成几段,每段用一张紧贴它的阴影贴图,使近处获得更多阴影纹素。它实现简单、能覆盖巨大场景、没有严重的最坏情况,因此被大量应用。关键问题是深度如何划分、近平面放在哪里、怎样避免抖动和级联边界的质量突变,以及如何降低多张贴图的开销。图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学遮挡剔除Occlusion Culling遮挡剔除尽早剔除被其他物体挡住的物体,避免它们在 z-buffer 中被光栅化、深度比较甚至着色。本页覆盖遮挡剔除的分类与通用框架、GPU 遮挡查询、层次 Z 缓冲 (HZB) 及其在现代引擎中的简化变体(含两遍法、软件光栅化遮挡),以及在 CPU/GPU 上按物体—簇—三角形多粒度组合剔除并用间接绘制提交的剔除系统。游戏开发 · UE5虚拟阴影贴图Virtual Shadow Maps虚拟阴影贴图 (Virtual Shadow Maps, VSM) 是 UE5 默认的阴影方法:概念上就是分辨率极高(虚拟 16k×16k)的阴影贴图,切成 128×128 的页 (Page),只为屏幕上需要着色的像素分配和渲染页,并跨帧缓存;方向光用 clipmap 覆盖大范围,软阴影由阴影贴图光线追踪 (Shadow Map Ray Tracing, SMRT) 生成。它为 Nanite 设计,与 Nanite 一起使用时最高效。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。图形学阴影基础与阴影体Shadow Basics & Shadow Volumes阴影帮助玩家判断物体的位置。精确光源只产生硬阴影,面光源产生带本影和半影的软阴影。最简单的情况是投射到平面上的投影阴影;投影纹理可把阴影扩展到曲面;阴影体用模板缓冲计数,能在任意表面得到精确硬阴影,但开销极不稳定,如今很少使用。图形学面光源Area Lights真实光源从来不是点。面光源要求对光源所张立体角 \omegal 积分 BRDF,实时渲染倾向于用闭式解或近似而不是多条光线取平均。主要做法有:Lambert 表面的矢量辐照度与包裹光照、光泽表面的粗糙度修正和"最具代表性的点",以及最准确的线性变换余弦 (LTC)。图形学着色模型与光源Shading Models & Light Sources着色模型描述物体颜色如何随表面朝向、观察方向和光照变化。光源通过两个参数与着色模型交互:指向光源的方向 \mathbf{l} 和光的颜色 \mathbf{c}{\text{light}}。方向光、点光源、聚光灯的区别就在于这两个量如何随场景变化;距离衰减和方向衰减函数的选择同时影响画面与性能。游戏美术阴影的美术功能与假阴影Shadow Visual Functions & Faking现以第 3 版 Ch3「Shadows and Occlusion」为准。 阴影与照明同等重要;occlusion 是可与常规阴影结合的柔和变暗。第 3 版新增 occlusion sandwich 等合成向手法。算法细节链图形学阴影/AO 页,本页偏美术功能与 cheat。游戏美术光的品质:软硬、衰减与 ThrowQualities of Light现以第 3 版为准。 第 1 版独立 Ch5「Qualities of Light」;第 3 版把品质讨论拆入 Ch1(识别光源)、Ch2(衰减/cookie)、Ch4(throw patterns)等。本页汇总美术向「光长什么样」:软硬、衰减、投射图案(gobo/cookie/throw)。游戏美术阴影的真实感要素Photoreal Shadow EssentialsDinur Ch8:阴影没有神秘「种类」,但制作上要抓住软硬(本影/半影)、影色、重叠与嵌套、接触/邻近影。本页补 Birn「影的构图功能与 cheat」与图形学阴影算法之间的外观检查清单。

输入关键词开始搜索

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