约 40 分钟技术学习游戏引擎

Games104学习笔记(28)

GAMES104:动态全局光照和 Lumen(上)

课程:GAMES104《现代游戏引擎:从入门到实践》
第 21 讲(上):动态全局光照和 Lumen
本地视频时长:约 1 小时 35 分钟 49 秒

一、本讲的知识主线

全局光照(Global Illumination,GI)要处理光在场景表面之间传播后对最终图像的影响。难点在于:任意一个被照亮的表面,都可能继续成为其他表面的间接光源。

实时引擎无法为每个像素追踪大量完整光路,因此要同时解决三个问题:

  • 怎样用较少样本估计入射光积分?
  • 怎样存储和查询场景几何、遮挡与光照?
  • 怎样让不同位置、方向和帧复用已经计算的信息?

本部分围绕这些问题展开:

渲染方程与重要性采样 → RSM 的次级光源 → LPV 的体积传播 → 体素锥追踪与 VXGI → SSGI 的屏幕数据复用 → Lumen 的采样问题 → Mesh SDF 与 Global SDF。

本地视频的末段讲到 Global SDF 的摄像机周围缓存。Lumen 在本部分主要作为这些技术的汇合背景,重点是它的软件追踪基础;完整光照缓存与最终收集流程不属于本笔记的展开范围。

二、直接光照、间接光照与全局光照

2.1 直接光照

光源发出的光直接到达着色点,中途没有经过其他表面的反射。

例如太阳照亮地面,或灯泡直接照亮桌面。计算通常需要光源参数、材质 BRDF,以及光源与着色点之间的可见性。

2.2 间接光照

光先照亮一个表面,再由该表面反射到另一个表面。

例如:

  • 阳光照亮红色墙面,墙面把带有红色倾向的反射光送到邻近白墙。
  • 窗外光进入室内,经过地板和家具反射,照亮没有被太阳直接照到的区域。
  • 自发光物体的光先照到墙面,再由墙面反射到其他物体。

自发光表面直接照到接收点时,它就是该路径的光源,这一段属于直接光照。

间接光照提供的不只是“把暗处提亮”,还包括颜色溢出、空间层次与物体间的光照联系。

2.3 全局光照为何昂贵

直接光照主要面对数量有限的显式光源。加入间接光照后,场景中大量受光表面都参与后续传播。

需要求解的关系是相互依赖的:

  • 表面 A 的出射光取决于 B、C 等表面的来光。
  • B、C 的出射光又可能取决于 A 和更多表面。
  • 几何、材质或光源变化后,这些关系也会变化。

动态 GI 因而同时涉及光照积分、场景表示、可见性和更新预算。

三、渲染方程:所有方法共同面对的问题

对不考虑透射的表面,渲染方程可写为:

$$ L_o(x,\omega_o)

L_e(x,\omega_o) + \int_{\Omega^+} f_r(x,\omega_i,\omega_o) L_i(x,\omega_i) \max(0,\mathbf n\cdot\omega_i) ,\mathrm d\omega_i $$

符号 含义
$x$ 着色点
$\mathbf n$ 表面单位法线
$\omega_i$ 指向入射光来源的单位方向
$\omega_o$ 指向观察方向的单位方向
$\Omega^+$ 法线朝向一侧的半球
$L_o$ 沿观察方向离开表面的辐亮度
$L_e$ 表面自身发出的辐亮度
$L_i$ 来自某个方向的入射辐亮度
$f_r$ 双向反射分布函数 BRDF
$\mathbf n\cdot\omega_i$ 入射方向与法线的余弦

这条方程包含三个不同问题:

  1. BRDF 决定材质怎样把光反射出去。
  2. 入射辐亮度决定某个方向上究竟有多少光。
  3. 半球积分要求综合所有可能入射方向。

GI 的主要困难在第二和第三点:入射光来自整个场景,而不是只来自灯光列表。

四、Radiance 与 Irradiance

4.1 辐亮度 Radiance

辐亮度 $L$ 保留方向信息,可理解为“某个位置沿某个方向传输的光有多强”。

它适合表示方向性光照、反射以及光路传播。

4.2 辐照度 Irradiance

辐照度 $E$ 是所有入射方向经过余弦加权后的总量:

$$ E(x,\mathbf n)

\int_{\Omega^+} L_i(x,\omega) \max(0,\mathbf n\cdot\omega) ,\mathrm d\omega $$

对于 Lambert 漫反射,若反射率为 $\rho$:

$$ f_d=\frac{\rho}{\pi} $$

则反射部分的出射辐亮度为:

$$ L_{o,\text{diffuse}}=\frac{\rho}{\pi}E $$

因此,知道辐照度后,漫反射着色很便宜;但一个已经积分过的辐照度值不能完整恢复所有方向上的辐亮度,也不能直接替代镜面反射所需的方向分布。

五、路径追踪:参考解与实时预算之间的差距

路径追踪从相机发出光线,在命中表面后采样下一条反射方向,继续追踪直到光源、环境或终止条件。

一条路径可能包含多次表面反射,其贡献受到各次 BRDF、采样概率和可见性的共同影响。

每个像素只有少量随机路径时,结果会出现噪声。增加样本能够降低噪声,却增加求交、材质计算和内存访问成本。

对独立样本、有限方差的普通蒙特卡洛估计,标准差通常满足:

$$ \sigma_N \propto \frac{1}{\sqrt N} $$

想把标准差降到原来的一半,通常需要约四倍样本。因此,实时 GI 不能仅靠不断提高每像素样本数。

课程用室外和室内的采样量对比说明这一矛盾:室内往往只有窗口等少量方向带来强光,许多随机方向贡献很低,采样尤其困难。课件中的光线数量用于说明当时的成本量级,不是所有平台的固定标准。

六、蒙特卡洛积分与 PDF

设:

$$ I=\int_D f(u),\mathrm du $$

按概率密度 $p(u)$ 采样 $N$ 个点,可构造估计:

$$ \widehat I_N

\frac{1}{N} \sum_{j=1}^{N} \frac{f(u_j)}{p(u_j)} $$

需要满足:

  • $p(u)$ 非负且归一化。
  • 被积函数有贡献的区域不能被采样分布完全排除。
  • 分母使用的 PDF 必须与实际采样方式、积分测度一致。

对于区间 $[a,b]$ 上的均匀采样:

$$ p(u)=\frac{1}{b-a} $$

所以:

$$ \widehat I_N

\frac{b-a}{N}\sum_{j=1}^{N}f(u_j) $$

除以 PDF 是对采样频率的补偿。只让高贡献区域被采得更多,却不补偿概率,会改变积分结果。

七、渲染方程中的重要性采样

忽略自发光项时,蒙特卡洛估计为:

$$ \widehat L_o

\frac{1}{N} \sum_{j=1}^{N} \frac{ L_i(x,\omega_j) f_r(x,\omega_j,\omega_o) \max(0,\mathbf n\cdot\omega_j) }{ p(\omega_j) } $$

理想分布应尽量贴近整个被积函数:

$$ F(\omega)

L_i(x,\omega) f_r(x,\omega,\omega_o) \max(0,\mathbf n\cdot\omega) $$

但 $L_i$ 往往正是未知量,因此实际只能依据已有信息选择采样分布。

7.1 半球均匀采样

半球立体角为 $2\pi$,按立体角均匀采样时:

$$ p_{\text{uniform}}(\omega)=\frac{1}{2\pi} $$

实现简单,但会在贡献很低的方向上花费许多样本。

“均匀选择极角”不等于“按立体角均匀采样”,因为球面面积还包含 $\sin\theta$ 因子。

7.2 余弦加权采样

对于漫反射,可以选择:

$$ p_{\text{cosine}}(\omega)

\frac{\max(0,\mathbf n\cdot\omega)}{\pi} $$

若同时采用 Lambert BRDF,估计式中的余弦与 PDF 抵消:

$$ \widehat L_{o,\text{diffuse}}

\frac{\rho}{N} \sum_{j=1}^{N}L_i(x,\omega_j) $$

它减少了方向余弦造成的方差,却仍无法保证采到窗口等真正高亮的区域。

7.3 GGX 采样

镜面反射的贡献集中在与反射方向相关的波瓣中。粗糙度越小,波瓣通常越窄,均匀采样越容易浪费样本。

课程展示 GGX 分布作为匹配镜面反射的采样依据。阅读实现时还需要区分:

  • 微表面法线或半向量 $\mathbf h$ 的分布。
  • 反射方向 $\omega_i$ 的分布。

若先采样半向量,再转换为反射方向,PDF 也需要通过雅可比转换:

$$ p(\omega_i)

\frac{p(\mathbf h)}{4|\omega_o\cdot\mathbf h|} $$

这是公式理解补充,不能把半向量 PDF 原封不动当成方向 PDF。可参照 PBRT 的反射函数采样说明。

八、RSM:把受光表面变成次级光源

Reflective Shadow Maps(反射阴影贴图,RSM)在普通 Shadow Map 的基础上增加受光表面的信息。

普通 Shadow Map 主要记录从光源看见的最近深度;RSM 还需要表达:

  • 表面位置。
  • 表面法线。
  • 与该表面反射光强相关的通量信息。

每个有效 texel 对应一个直接受光的表面片段,可以被视为一个虚拟点光源(Virtual Point Light,VPL)。

于是一次间接光照可转化为:

  1. 从原光源视角生成 RSM。
  2. 把 RSM 的受光 texel 当作次级光源。
  3. 从接收点收集这些次级光源的贡献。

它沿用光源视角的栅格化结果,不需要对每个接收像素从头搜索所有受光表面。

九、RSM 单个 texel 的贡献

设一个次级光源的位置为 $x_p$,法线为 $\mathbf n_p$,反射光权重为 $\Phi_p$;接收点为 $x$,法线为 $\mathbf n$。本笔记将次级表面自身的反射率、面积与 Lambert 方向归一化吸收到 $\Phi_p$ 中:若该小面片的总反射通量是 $\Phi_{p,\text{total}}$,则采用 $\Phi_p=\Phi_{p,\text{total}}/\pi$。

课程给出的贡献形式可写为:

$$ E_p(x,\mathbf n)

\Phi_p \frac{ \max(0,\mathbf n_p\cdot(x-x_p)) \max(0,\mathbf n\cdot(x_p-x)) }{ |x-x_p|^4 } $$

这里两个点积使用的方向向量没有归一化。设:

$$ r=|x-x_p|,\qquad \mathbf d=\frac{x-x_p}{r} $$

则可改写为:

$$ E_p(x,\mathbf n)

\Phi_p \frac{ \max(0,\mathbf n_p\cdot\mathbf d) \max(0,\mathbf n\cdot(-\mathbf d)) }{ r^2 } $$

所以分母的四次方不意味着光照遵循单纯的 $1/r^4$ 衰减;分子里的两个未归一化向量各含一个距离因子。

两个余弦分别表达:

  • 次级光源是否朝向接收点。
  • 接收点是否朝向次级光源。

这里的 $E_p$ 是接收辐照度,尚未包含接收面的反射率;要得到接收面的 Lambert 出射辐亮度,还需乘 $\rho_x/\pi$。不同 RSM 实现可能把归一化常数放在其他环节,读取代码时必须对齐约定,不能把权重简单理解成未经处理的屏幕 RGB。

十、RSM 的收集、采样与可见性

10.1 收集

所有次级光源贡献求和:

$$ E_{\text{indirect}}(x,\mathbf n) \approx \sum_{p\in\text{RSM}}E_p(x,\mathbf n) $$

遍历整张 RSM 很贵,所以实际会采样一部分 texel,再根据采样方式加权。

课程介绍预先生成采样模式并复用,以及通过 Poisson 分布让样本更均匀。示例中的样本数属于特定方法的设置,应结合分辨率与预算理解。

10.2 间接可见性缺失

RSM 知道“原光源能看见哪个表面”,但这不等于知道“次级光源与接收点之间是否被挡住”。

更完整的模型应有:

$$ E_{\text{indirect}}(x,\mathbf n) \approx \sum_p V(x,x_p)E_p(x,\mathbf n) $$

其中 $V(x,x_p)$ 为两点之间的可见性。课程讨论的基础 RSM 简化掉了这一检查,因此会出现墙后漏光等问题。

另外,RSM 只覆盖光源视角采到的表面,且基础流程主要近似一次间接反弹。

十一、低分辨率间接光照与边缘校验

漫反射间接光照常比较平滑,可先以低分辨率计算,再恢复全分辨率。

课程给出的流程是:

  1. 计算低分辨率间接光照。
  2. 对全分辨率像素找到周围低分辨率样本。
  3. 比较法线和世界空间位置,判断样本是否来自相同或相近表面。
  4. 对有效样本插值。
  5. 对无法可靠重建的像素重新计算。

普通双线性插值只看屏幕位置,可能把前景与背景或墙体两侧的光混在一起。几何校验的作用是让光照平滑发生在真实相近的表面上。

这种“低频量低分辨率计算,高频几何全分辨率判断”的思想,后面还会出现在探针重建中。

十二、LPV:在三维网格中传播光

Light Propagation Volumes(光传播体积,LPV)将场景划分为三维网格,把直接受光表面的反射光注入网格,再让相邻单元交换光照信息。

基本流程:

  1. 用 RSM 等方法获得次级光源。
  2. 把次级光源注入所在网格单元。
  3. 用紧凑的方向表示保存光照。
  4. 从相邻单元收集传播来的光。
  5. 多次迭代。
  6. 着色点查询附近单元,估计间接光照。

RSM 为每个接收点直接收集许多次级光源;LPV 先把这些源压缩到体积中,再让整个场景复用体积查询。

十三、用球谐函数保存方向分布

网格中只保存一个 RGB 会丢失光来自哪个方向的信息。LPV 使用低阶球谐函数(Spherical Harmonics,SH)表示平滑的方向分布。

课程示例使用 $l=0$ 和 $l=1$ 两个带,共四个基函数。以下采用实数正交归一 SH 基,以 $v$ 表示网格单元、$a$ 表示颜色通道:

$$ L_{v,a}(\omega) \approx \sum_{l=0}^{1}\sum_{m=-l}^{l} c_{lm}^{v,a}Y_{lm}(\omega) $$

系数由投影得到:

$$ c_{lm}^{v,a}

\int_{\mathbb S^2} L_{v,a}(\omega)Y_{lm}(\omega) ,\mathrm d\omega $$

每个颜色通道都需要一组系数。

低阶 SH 的优点是存储少、运算便宜,适合平滑漫反射光照;代价是无法精确表示很窄的方向波瓣或尖锐遮挡边界。

这里明确写出 $l=0,1$,可以避免中文“二阶球谐”与不同资料的阶数命名习惯造成混淆。

十四、LPV 的传播与局限

每个网格单元从六个面对应的邻居收集入射光,转换到当前单元的方向分布,再重新投影到 SH。

可用示意关系表达:

$$ \mathbf c_v^{(k+1)}

\sum_{q\in\mathcal N_6(v)} \mathcal T_{q\to v}\mathbf c_q^{(k)} $$

其中 $\mathcal T_{q\to v}$ 表示方向、面立体角和遮挡等传播近似。对每个颜色通道,$\mathbf c_v^{(0)}$ 表示注入的 SH 系数向量,$\mathbf c_v^{(k)}$ 表示第 $k$ 轮新传播的贡献;在这种状态约定下,最终供查询的光场应累积各轮:

$$ \mathbf C_v=\sum_{k=0}^{K}\mathbf c_v^{(k)} $$

这组式子说明信息交换与累计的区别,不是完整 LPV 着色器。

需要注意:

  • 一次传播迭代表示信息向邻近网格移动,不等于一次真实表面反弹。
  • 若把迭代分摊到多帧,光照变化会产生更新延迟。
  • 网格分辨率限制了细小遮挡的表达。
  • 低阶方向表示会把细节平滑掉。
  • 遮挡处理不足时容易漏光;处理过强又可能过度遮挡。

LPV 也有包含几何遮挡的扩展版本,因此不能把 RSM 的“忽略间接可见性”直接当成所有 LPV 的定义。相关原始研究见 Cascaded LPV 作者报告。

十五、体素锥追踪:把方向范围与空间层级结合

一条细光线只代表一个方向。对于较平滑的漫反射或粗糙镜面反射,可以用锥体近似一束具有一定角度范围的方向。

Voxel Cone Tracing(体素锥追踪,VCT)的思路是:

  1. 将场景几何与反射光照体素化。
  2. 构建多分辨率表示。
  3. 从着色点沿若干锥体收集光。
  4. 越远离起点,锥体横截面越大,采用越粗的层级。

若锥体半角为 $\theta$,距起点为 $t$,其截面直径约为:

$$ D(t)=2t\tan\theta $$

细体素尺寸为 $h$ 时,所需层级可近似理解为:

$$ \ell(t) \approx \log_2\left(\frac{D(t)}{h}\right) $$

实际应钳制到有效层级并处理起点附近。

关键是让一次粗层级查询代表一片空间范围,减少逐条光线的独立查询。

十六、SVO:稀疏体素八叉树

Sparse Voxel Octree(SVO)用八叉树划分三维空间。一个节点可细分为八个子节点,空区域不必保留完整高分辨率体素。

课程中的流程包含:

  • 在细层体素中注入受光表面的光照信息。
  • 在树中向粗层级过滤或聚合。
  • 从相机可见表面发射漫反射锥、镜面锥。
  • 根据锥体的增长范围查询相应树层。

其优势是稀疏、分辨率自适应;工程代价是建树、更新、节点存储与不规则访问。

漫反射需要覆盖较宽方向范围,镜面锥的宽度与粗糙度相关。接近完美镜面时,宽锥平均会模糊反射细节。

原始方法的研究说明可参照 NVIDIA:Interactive Indirect Illumination Using Voxel Cone Tracing。

十七、VXGI 与 Clipmap

课程接着讨论基于体素化的全局光照(Voxelization Based Global Illumination,VXGI)及使用规则 Clipmap 存储的实现思路。

17.1 Mipmap 与 Clipmap 的区别

表示 典型特点
Mipmap 同一覆盖区域逐级降低分辨率
Clipmap 各层保持有限数组规模,越粗的层覆盖越大空间
SVO 根据空间占用递归细分,保存不规则稀疏结构

Clipmap 围绕摄像机安排:

  • 近处使用较细空间采样。
  • 远处使用较粗采样。
  • 多层共同覆盖较大世界。

规则三维纹理更容易利用 GPU 采样和过滤,也减少树节点与指针访问,但会为覆盖区域中的空空间支付存储成本。

17.2 体积存储增长很快

若每层有 $R^3$ 个体素,共 $K$ 层,每体素占 $B$ 字节,则粗略存储为:

$$ M\approx KR^3B $$

空间分辨率每轴翻倍,总体素数会增加八倍。因此,体素 GI 的分辨率、覆盖范围、方向通道和更新频率必须一起考虑。

十八、环绕寻址与增量更新

摄像机移动时,Clipmap 的世界覆盖范围需要移动。如果每次都搬移整个纹理,开销很大。

Toroidal Addressing(环绕寻址)把世界坐标周期性映射到有限纹理:

$$ \mathbf u

\operatorname{frac}\left(\frac{\mathbf x}{\mathbf S}\right) $$

其中按分量计算,$\mathbf S$ 是该层的世界覆盖尺寸。

也可用离散网格形式理解:

$$ \mathbf a=\mathbf g\bmod R $$

其中 $\mathbf g$ 是世界网格坐标;负坐标应使用非负模运算。

这样:

  • 覆盖区域内的同一世界网格保持稳定物理地址。
  • 摄像机移动后,重叠区域继续复用已有数据。
  • 只更新新进入覆盖范围的条带。

周期映射可能让不同世界位置共享同一物理地址,所以还必须记录当前层的有效世界范围,不能仅凭纹理地址判断数据有效。

十九、体素化需要同时表达光照与遮挡

体素 GI 不只保存亮度,还需要不透明度或覆盖率来近似遮挡。

课程展示的体素化过程包括:

  1. 为三角形选择投影面积最大的平面。
  2. 利用 MSAA 样本估计覆盖。
  3. 把样本重投影到其他平面。
  4. 将覆盖写入体素。
  5. 对结果适当加厚或过滤,减少几何遗漏。

覆盖率可示意为:

$$ \alpha

\frac{N_{\text{covered}}}{N_{\text{total}}} $$

随后利用 RSM 等信息,把被直接照亮表面的反射光注入相应体素。

遮挡表示与光照表示各自承担不同任务:没有遮挡,光容易穿墙;没有光照,体素只能说明哪里存在几何。

二十、沿锥体累计光照与不透明度

课程采用前向累积形式:

$$ C_{\text{acc}} \leftarrow C_{\text{acc}} + (1-\alpha_{\text{acc}})C_{\text{sample}} $$

$$ \alpha_{\text{acc}} \leftarrow \alpha_{\text{acc}} + (1-\alpha_{\text{acc}})\alpha_{\text{sample}} $$

当前积累越不透明,后方样本贡献越小。

第一条式子要求 $C_{\text{sample}}$ 已按该采样的不透明度预乘;若存储的是未预乘颜色,则还需要乘 $\alpha_{\text{sample}}$。混淆两种约定会导致错误亮度。

累积接近完全不透明后可以提前结束。锥体扩张时还要相应调整层级与步长,避免对重叠区域不加区分地重复计数。

二十一、体素 GI 的两个典型问题

21.1 遮挡累积不准确

粗体素的不透明度是区域平均,不是每一条具体光线的二值可见性。

多个采样体积可能相互重叠,或表示同一片几何。直接使用 Alpha 混合,会隐含独立覆盖等近似,从而发生遮挡过强或过弱。

21.2 薄墙漏光

当墙厚远小于体素尺寸时:

  • 体素可能混合墙两侧的数据。
  • 粗层级过滤会把亮侧能量扩散到暗侧。
  • 锥查询无法精确区分实际路径是否穿过墙。

提高分辨率、改善方向表示或保守体素化可以缓解问题,但都会增加成本,且不等于获得精确三角形可见性。

二十二、SSGI:复用当前帧已经渲染的信息

Screen Space Global Illumination(屏幕空间全局光照,SSGI)利用深度、法线和场景光照颜色进行间接光收集。

基本流程:

  1. 在当前着色点根据 BRDF 产生采样方向。
  2. 将光线投影到屏幕空间。
  3. 沿投影路径与深度缓冲比较,寻找命中。
  4. 读取命中处的光照颜色,作为该方向来光的近似。
  5. 对多个样本加权、过滤和重建。

它复用了栅格化已经计算出的可见表面,因此成本更多受分辨率、追踪步数和样本数控制,而不是直接随场景全部三角形数增长。

动态物体只要进入当前帧可用缓冲,就能参与屏幕追踪。

二十三、SSGI 与 SSR 的关系

SSGI 和屏幕空间反射(SSR)可共用深度追踪、层级遍历和颜色查询等机制,但方向采样不同:

  • 漫反射 GI 需要较宽的方向分布。
  • 镜面或光泽反射更集中在反射波瓣附近。

课程用镜面和光泽反射示例说明屏幕追踪的能力,不能据此认为 SSGI 只是在做镜面反射。

命中像素的颜色原本沿相机方向渲染;拿它当作朝当前着色点的出射光,相当于加入方向复用近似。对漫反射更合理,对强方向性材质则需要谨慎。

应该使用可参与光照运算的线性光照数据,而不是直接把最终色调映射后的显示颜色当作物理辐亮度。

二十四、层级深度追踪

固定小步长 Ray Marching 会反复查询许多空区域。课程用层级深度金字塔(Hi-Z)加速:

  1. 从原始深度构建多层归约。
  2. 在粗层判断一片屏幕区域是否可能有交点。
  3. 确定没有交点时快速跳过。
  4. 可能命中时下降到更细层级。
  5. 直到确认交点或退出有效范围。

课程示意的是 Min-depth Pyramid。实际使用最小值还是最大值取决于深度编码:

  • 常规深度通常较小值代表更近。
  • Reversed-Z 通常较大值代表更近。

归约规则必须与比较逻辑一致。层级遍历节省空区搜索成本,但无法恢复深度缓冲本来没有记录的几何。

二十五、邻近像素光线复用

附近像素往往看到相近表面,可以保存已有光线的命中点,让邻近像素也使用这些样本。

这类方法利用一个近似:

附近接收点到同一命中点的可见性可能相似。

复用可以增加有效采样信息,但需要重新考虑当前接收点的方向、BRDF 和几何关系。

在墙角、细缝和前后景边缘附近,该可见性假设容易失败:邻居能看见的点,当前像素可能被墙挡住。

因此,样本复用应结合深度、法线、位置与可见性校验;不能把邻居结果直接视为无条件有效。

二十六、SSGI 的优势与信息边界

优势:

  • 能使用当前可见表面的细节。
  • 对接触附近的光照和遮挡效果有价值。
  • 支持进入缓冲的动态对象。
  • 不必维护覆盖全世界的高精度体积数据。

局限:

  • 屏幕之外没有当前帧数据。
  • 被前景遮住的表面通常没有记录。
  • 单层深度不能完整表达厚度或所有交点。
  • 相机移动会改变可用信息,容易产生视角相关变化。
  • 邻近样本复用可能引入错误可见性。

课程对遮挡能力的肯定,应理解为它能直接利用已记录的可见几何。屏幕追踪仍会受到信息缺失、厚度近似和步进误差影响。

二十七、Lumen 面临的采样问题

前面的方法分别节省了不同成本:

  • RSM 复用光源视角采样。
  • LPV 压缩并传播低频光照。
  • 体素锥追踪用多分辨率空间表示汇集方向范围。
  • SSGI 复用屏幕可见数据。

但复杂室内仍然困难:一个很亮却很小的窗口,在半球中只占很少方向。有限随机样本可能经常漏掉它,偶尔命中又产生很大贡献,导致明显噪声。

所以“追踪一条光线更快”只解决求交成本;要获得稳定 GI,还需要更合理的采样与重建。

课件提出用经过过滤的低分辨率场景空间探针,为全分辨率像素提供光照,再结合细节法线进行最终着色。这里体现的是光照与几何细节的计算频率分离,并不意味着所有材质都能用一个探针 RGB 完整表示。

二十八、SDF:把几何转换成距离查询

Signed Distance Field(有符号距离场,SDF)为每个位置保存到最近表面的距离,并用符号区分内外:

$$ d(x)= \begin{cases} +\operatorname{dist}(x,\partial S), & x\notin S,\ 0, & x\in\partial S,\ -\operatorname{dist}(x,\partial S), & x\in\operatorname{int}(S). \end{cases} $$

其中 $S$ 为物体占据区域,$\partial S$ 为表面。

可理解为:

  • 正值:物体外。
  • 零值:表面。
  • 负值:物体内。

SDF 存储的是几何距离,不是辐亮度、材质或间接光照。追踪命中后,仍需要别的数据取得光照。

二十九、Mesh SDF:每个网格独立建立距离场

为整个世界直接保存高分辨率 SDF,会产生巨大的体积存储。

Per-Mesh SDF 为每个 Mesh 生成局部距离场,运行时结合实例变换使用。相同资源的多个实例可复用源数据。

课程提到:

  • 根据模型尺寸选择采样分辨率。
  • 用点到三角形距离查询生成距离值。
  • 通过射线命中背面等信息估计符号。
  • 分辨率过低会丢失重要几何特征。

背面命中比例阈值属于具体构建算法的启发式。开放、不闭合或很薄的网格,其内外判断和距离表示会更困难。

局部距离换成世界步长时还必须处理缩放:均匀缩放比较直接,非均匀缩放下不能把局部距离未经修正地当成世界空间安全距离。

三十、Sphere Tracing:利用空球快速前进

设光线为:

$$ \mathbf r(t)=\mathbf o+t\mathbf v,\qquad |\mathbf v|=1 $$

若当前位置在物体外,精确 SDF 给出到最近表面的距离 $d(\mathbf r(t))$,则以当前位置为中心、这个距离为半径的球内没有表面。

因此可采用:

$$ t_{k+1}=t_k+d(\mathbf r(t_k)) $$

对于始终保持在物体外的追踪,当非负距离小于命中阈值时,可接受为近表面命中:

$$ 0\le d(\mathbf r(t_k))<\varepsilon $$

或超过最大追踪距离、最大迭代次数。

与固定步长相比:

  • 空区域中可以大步前进。
  • 接近表面时自动缩小步长。
  • 不必每一步测试大量三角形。

“安全不穿过表面”的条件是距离值精确,或至少为非负保守下界。实际纹理 SDF 存在采样、插值和缩放误差,可能需要安全系数与更保守的步进。

内部起点或误差导致的负距离需要单独处理,不能直接使用负距离向前步进,也不能用单纯的 $d<\varepsilon$ 把深处内部误判成近表面。判断一般位置是否接近零等值面时,应考察 $|d|<\varepsilon$;具体内外追踪策略需另行定义。

三十一、SDF 与软阴影近似

SDF 不只用于判断一条光线是否命中,还可估计光线经过遮挡物附近时,光源可能被遮住多少。

设采样点为 $p$,光线起点为 $o$:

$$ t=|p-o| $$

最近表面距离为 $d(p)$。当 $t>0$ 且 $0\le d(p)\le t$ 时,从起点看这个最近距离空球,其切线半角为:

$$ \theta

\arcsin\left(\frac{d(p)}{t}\right) $$

这个角度描述沿光线的无障碍角空间,并非遮挡物或光源的真实角宽;$d(p)>t$ 时,上述切线构造不适用。沿路径寻找较小角度,可以近似估计周围几何对有限角宽光源的遮挡。常用的便宜近似形式为:

$$ s \approx \operatorname{clamp}\left( \min_{t>0} \frac{k,d(\mathbf r(t))}{t}, 0,1 \right) $$

其中 $k$ 控制软硬程度,较大的 $k$ 通常使阴影更硬。

这是软阴影启发式近似,不能替代对面积光源所有方向的精确可见性积分。起点、负距离和命中情况也需要单独处理。

三十二、Mesh SDF 的 LOD、流送与稀疏存储

32.1 多分辨率

课件示例为 Mesh SDF 提供三个 Mip:

  • 最低分辨率常驻,保证基本表示始终存在。
  • 较高分辨率按需求流送。
  • GPU 收集需要的数据页。
  • CPU 读取需求并安排页载入、移出。

课件中的 “download requests” 是 GPU 到 CPU 的请求回读,不是下载网络文件。

32.2 稀疏 Brick

将三维网格划分为小块 Brick,可以只为需要保留细节的区域存储完整数据。

在不影响有效追踪的前提下,远离表面或可用较简表示的区域可以减少存储。

内存成本于是取决于有效 Brick 数,而非完整包围盒的全部高分辨率体素数。收益受模型形状、表面密度和数据格式影响。

三十三、Global SDF:让远距离查询更便宜

只使用 Mesh SDF 时,每次查询都可能需要找出影响当前位置的 Mesh,并查询多个独立距离场。

Global SDF 把相关实例合并到较粗的世界空间距离场,方便统一查询。

它在近表面通常不如 Mesh SDF 精确,因此课程采用组合策略:

  • 追踪起点附近,用对象距离场保留较细几何。
  • 后续较远部分,改用 Global SDF 降低成本。

这里与体素锥追踪有相同的预算分配思路:近处保留精度,远处接受更粗表示。

距离场的合并和重采样也会引入误差,不能把粗 Global SDF 看作精确世界三角形求交。

三十四、围绕摄像机缓存 Global SDF

课件展示四层摄像机中心 Clipmap,并强调:

  • 摄像机移动时滚动覆盖范围。
  • 复用仍在范围内的数据。
  • 更远层以较低频率更新。
  • 采用稀疏存储减少内存。

这里优化的是场景几何表示的维护成本,而不是直接解决整个光照积分。

Mesh SDF 的资源流送、Global SDF 的场景合成、最终间接光照的更新是不同工作:

工作 主要对象 更新触发
Mesh SDF 流送 网格距离场数据页 精度需求、可见范围、资源使用
Global SDF 更新 世界空间合成距离场 摄像机滚动、实例移动或变化
光照更新 受光和反射能量 灯光、材质、几何变化

一个数据层更新正确,不代表其他层也已经同步完成。

三十五、这些基础如何连接到 Lumen

本部分可以建立三个清晰的职责:

  1. 追踪:光线沿某方向是否命中场景,命中哪里?
  2. 光照查询:命中表面向接收点提供多少光?
  3. 收集与重建:怎样用有限样本得到稳定像素结果?

SDF 主要服务第一项;RSM、光照注入、方向分布与缓存思想服务第二项;重要性采样、低分辨率结果和样本复用服务第三项。

作为后续阅读补充,Epic 的 Lumen 技术文档说明其组合使用屏幕追踪,以及软件或硬件追踪;Surface Cache 用于查询场景表面的材质和光照信息。具体设置随版本变化,参见 Epic:Lumen Technical Details。这段用于衔接完整架构,不代表本地上半视频已详细展开 Surface Cache。

三十六、各方法的比较

方法 核心复用或表示 主要节省 主要误差来源
蒙特卡洛路径追踪 随机光路 通用积分估计 有限样本噪声、路径截断
RSM 光源视角的受光 texel 次级光源构建与搜索 基础形式缺少间接可见性、单次反弹
LPV 三维网格与低阶 SH 压缩方向光照、共享查询 空间和角度分辨率、传播近似
SVO / VCT 稀疏层级体素与锥查询 大范围预过滤查询 体素化和锥平均、更新开销
VXGI / Clipmap 规则多层体素纹理 GPU 采样、局部更新 内存成本、薄墙和粗层级遮挡
SSGI 深度与光照颜色缓冲 复用当前帧可见数据 屏幕外缺失、单层深度、方向复用
SDF 追踪 到表面的距离 空区快速跳步 距离场分辨率、缩放与构建误差

SDF 行描述的是追踪组件,不能与前几项一样被当成独立完整 GI 系统。

三十七、容易混淆的概念

  • GI 包括表面间的能量传播;AO 主要表达局部遮挡,不能独立提供完整间接光。
  • BRDF 说明材质怎样反射,PDF 说明方向怎样被抽样,两者不是同一个函数。
  • RSM 原光源的可见性,不等于次级光源到接收点的可见性。
  • RSM 分母的距离四次方,要结合未归一化点积一起解释。
  • LPV 传播迭代次数,不等于真实光路反弹次数。
  • 低阶 SH 保存平滑方向分布,不能准确恢复尖锐高光。
  • Mipmap 改变分辨率;Clipmap 还通过分层覆盖控制世界范围。
  • 体素不透明度是区域近似,不等于任意具体光线的精确可见性。
  • SSGI 看见的是缓冲中已有的数据,摄像机变化会改变可用样本。
  • 球面上的均匀极角采样,不等于均匀立体角采样。
  • SDF 保存几何距离;得到命中位置后仍需查询光照。
  • 精确 SDF 的安全步长性质,不能无条件套用到有误差的纹理距离场。

三十八、核心术语

术语 含义
Global Illumination / GI 考虑场景整体光传输的全局光照
Direct Illumination 光源直接照到表面
Indirect Illumination 经过其他表面反射后的光照
Radiance 保留方向信息的辐亮度
Irradiance 来光经余弦加权积分后的辐照度
BRDF 材质的双向反射分布函数
PDF 采样概率密度函数
Importance Sampling 按贡献相关分布增加有效样本
VPL 表示受光表面贡献的虚拟点光源
RSM 带受光表面信息的反射阴影贴图
LPV 用网格和方向系数传播光的体积表示
SH 表示球面方向函数的球谐基
SVO 稀疏体素八叉树
VCT 根据锥体范围查询层级体素的锥追踪
VXGI 课程中的基于体素化的 GI 方法
Clipmap 近细远粗、覆盖范围分层的纹理结构
Toroidal Addressing 使用周期映射复用有限物理存储
SSGI 利用屏幕可见数据估计间接光照
SSR 屏幕空间反射
Hi-Z 用于层级查询的深度金字塔
SDF 到最近表面的有符号距离场
Sphere Tracing 按距离场值自适应前进的追踪方法
Mesh SDF 单个网格的局部距离场
Global SDF 合成并缓存的世界空间距离场
Brick 稀疏体积存储中的小数据块
Probe 为周围位置提供方向光照信息的采样点

三十九、复习要点

  1. 渲染方程把出射光写成自发光与所有方向反射光的总和。
  2. 光照困难来自未知来光和可见性,不只是 BRDF 运算。
  3. 普通蒙特卡洛误差下降慢,实时 GI 必须减少方差并复用计算。
  4. 重要性采样要与实际 PDF 配套,且不能漏掉有贡献的区域。
  5. 余弦采样适合漫反射,GGX 采样适合匹配镜面波瓣。
  6. RSM 将直接受光表面转化为次级光源。
  7. 基础 RSM 对间接可见性的省略,是漏光的重要来源。
  8. 低分辨率光照必须结合全分辨率几何校验,防止跨边缘混合。
  9. LPV 用网格和低阶 SH 换取快速的方向传播与查询。
  10. 体素锥追踪用粗层级近似较大的空间和方向范围。
  11. Clipmap 的优势来自规则存储、多尺度覆盖和增量更新。
  12. 体素分辨率不足与遮挡累积近似会造成漏光或错误遮挡。
  13. SSGI 高效利用当前可见表面,同时受屏幕信息边界限制。
  14. 层级深度减少无效步进,邻近样本复用减少重复追踪。
  15. SDF 把几何求交转换为距离查询,Sphere Tracing 借此跳过空区。
  16. Mesh SDF 保留局部精度,Global SDF 降低大范围查询成本。
  17. 距离场、光照缓存与像素重建需要分别设计和更新。
  18. Lumen 的理解基础,是把追踪、光照查询、采样重建连成一个整体。

四十、参考资料