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$ | 入射方向与法线的余弦 |
这条方程包含三个不同问题:
- BRDF 决定材质怎样把光反射出去。
- 入射辐亮度决定某个方向上究竟有多少光。
- 半球积分要求综合所有可能入射方向。
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)。
于是一次间接光照可转化为:
- 从原光源视角生成 RSM。
- 把 RSM 的受光 texel 当作次级光源。
- 从接收点收集这些次级光源的贡献。
它沿用光源视角的栅格化结果,不需要对每个接收像素从头搜索所有受光表面。
九、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 只覆盖光源视角采到的表面,且基础流程主要近似一次间接反弹。
十一、低分辨率间接光照与边缘校验
漫反射间接光照常比较平滑,可先以低分辨率计算,再恢复全分辨率。
课程给出的流程是:
- 计算低分辨率间接光照。
- 对全分辨率像素找到周围低分辨率样本。
- 比较法线和世界空间位置,判断样本是否来自相同或相近表面。
- 对有效样本插值。
- 对无法可靠重建的像素重新计算。
普通双线性插值只看屏幕位置,可能把前景与背景或墙体两侧的光混在一起。几何校验的作用是让光照平滑发生在真实相近的表面上。
这种“低频量低分辨率计算,高频几何全分辨率判断”的思想,后面还会出现在探针重建中。
十二、LPV:在三维网格中传播光
Light Propagation Volumes(光传播体积,LPV)将场景划分为三维网格,把直接受光表面的反射光注入网格,再让相邻单元交换光照信息。
基本流程:
- 用 RSM 等方法获得次级光源。
- 把次级光源注入所在网格单元。
- 用紧凑的方向表示保存光照。
- 从相邻单元收集传播来的光。
- 多次迭代。
- 着色点查询附近单元,估计间接光照。
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)的思路是:
- 将场景几何与反射光照体素化。
- 构建多分辨率表示。
- 从着色点沿若干锥体收集光。
- 越远离起点,锥体横截面越大,采用越粗的层级。
若锥体半角为 $\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 不只保存亮度,还需要不透明度或覆盖率来近似遮挡。
课程展示的体素化过程包括:
- 为三角形选择投影面积最大的平面。
- 利用 MSAA 样本估计覆盖。
- 把样本重投影到其他平面。
- 将覆盖写入体素。
- 对结果适当加厚或过滤,减少几何遗漏。
覆盖率可示意为:
$$ \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)利用深度、法线和场景光照颜色进行间接光收集。
基本流程:
- 在当前着色点根据 BRDF 产生采样方向。
- 将光线投影到屏幕空间。
- 沿投影路径与深度缓冲比较,寻找命中。
- 读取命中处的光照颜色,作为该方向来光的近似。
- 对多个样本加权、过滤和重建。
它复用了栅格化已经计算出的可见表面,因此成本更多受分辨率、追踪步数和样本数控制,而不是直接随场景全部三角形数增长。
动态物体只要进入当前帧可用缓冲,就能参与屏幕追踪。
二十三、SSGI 与 SSR 的关系
SSGI 和屏幕空间反射(SSR)可共用深度追踪、层级遍历和颜色查询等机制,但方向采样不同:
- 漫反射 GI 需要较宽的方向分布。
- 镜面或光泽反射更集中在反射波瓣附近。
课程用镜面和光泽反射示例说明屏幕追踪的能力,不能据此认为 SSGI 只是在做镜面反射。
命中像素的颜色原本沿相机方向渲染;拿它当作朝当前着色点的出射光,相当于加入方向复用近似。对漫反射更合理,对强方向性材质则需要谨慎。
应该使用可参与光照运算的线性光照数据,而不是直接把最终色调映射后的显示颜色当作物理辐亮度。
二十四、层级深度追踪
固定小步长 Ray Marching 会反复查询许多空区域。课程用层级深度金字塔(Hi-Z)加速:
- 从原始深度构建多层归约。
- 在粗层判断一片屏幕区域是否可能有交点。
- 确定没有交点时快速跳过。
- 可能命中时下降到更细层级。
- 直到确认交点或退出有效范围。
课程示意的是 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
本部分可以建立三个清晰的职责:
- 追踪:光线沿某方向是否命中场景,命中哪里?
- 光照查询:命中表面向接收点提供多少光?
- 收集与重建:怎样用有限样本得到稳定像素结果?
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 | 材质的双向反射分布函数 |
| 采样概率密度函数 | |
| 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 | 为周围位置提供方向光照信息的采样点 |
三十九、复习要点
- 渲染方程把出射光写成自发光与所有方向反射光的总和。
- 光照困难来自未知来光和可见性,不只是 BRDF 运算。
- 普通蒙特卡洛误差下降慢,实时 GI 必须减少方差并复用计算。
- 重要性采样要与实际 PDF 配套,且不能漏掉有贡献的区域。
- 余弦采样适合漫反射,GGX 采样适合匹配镜面波瓣。
- RSM 将直接受光表面转化为次级光源。
- 基础 RSM 对间接可见性的省略,是漏光的重要来源。
- 低分辨率光照必须结合全分辨率几何校验,防止跨边缘混合。
- LPV 用网格和低阶 SH 换取快速的方向传播与查询。
- 体素锥追踪用粗层级近似较大的空间和方向范围。
- Clipmap 的优势来自规则存储、多尺度覆盖和增量更新。
- 体素分辨率不足与遮挡累积近似会造成漏光或错误遮挡。
- SSGI 高效利用当前可见表面,同时受屏幕信息边界限制。
- 层级深度减少无效步进,邻近样本复用减少重复追踪。
- SDF 把几何求交转换为距离查询,Sphere Tracing 借此跳过空区。
- Mesh SDF 保留局部精度,Global SDF 降低大范围查询成本。
- 距离场、光照缓存与像素重建需要分别设计和更新。
- Lumen 的理解基础,是把追踪、光照查询、采样重建连成一个整体。
四十、参考资料
- GAMES104 第 21 讲(上):动态全局光照和 Lumen(Bilibili)
- Carsten Dachsbacher 的 KIT 论文目录:Reflective Shadow Maps:用于核对 RSM 的原始研究。
- Cascaded Light Propagation Volumes 作者报告:网格、SH 与动态间接光的原始研究介绍。
- NVIDIA:Interactive Indirect Illumination Using Voxel Cone Tracing:层级体素与锥追踪的原始研究。
- PBRT:Sampling Reflection Functions:采样 PDF 与微表面方向转换补充。
- Epic:Lumen Technical Details:完整 Lumen 架构补充;具体实现与设置以所用 UE 版本为准。