多光源采样与光源 BVH
Many-Light Sampling & Light BVH
场景有成百上千个光源时,不可能在每个着色点对所有光源做直接光照。利用求和的蒙特卡洛估计 ,每次只随机选一个(或几个)光源并除以其概率即可无偏。选择概率可以均匀、按功率,或随着色点变化——后者需要一棵把光源聚合起来的层次结构(光源 BVH)。本页对应 PBRT 4e 12.6 节,并对照实时渲染的分簇/分块光源剔除。
离散蒙特卡洛估计
这是积分蒙特卡洛估计的离散版本(见 蒙特卡洛积分与重要性采样)。理想的 随位置、法线、BSDF 变化:背向或被遮挡的光源概率应为 0,又远又暗的光源概率应低,但小而暗的光源对紧邻它的点仍很重要。光源采样器还要提供 PMF(),供 BSDF 采样碰到光源时计算 MIS 权重;以及与着色点无关的采样,供双向方法从光源出发。
三种采样器
| 采样器 | 概率 | 效果(书中数据) |
|---|---|---|
UniformLightSampler | 基线 | |
PowerLightSampler | (别名表 alias table;哈希表从光源映射到下标以求 PMF) | Zero Day 场景(8,878 个光源,16 spp)MSE 比均匀低 12.4 倍 |
BVHLightSampler(默认) | 沿树按子节点重要性逐层随机选择 | 比按功率 MSE 再低 2.37 倍,时间只多 5.8%,效率提高 2.25 倍;两个光源的简单场景 1 spp 也有 2.72 倍改善 |
按功率采样的缺陷:一个辐射亮度很低的巨大三角形光源,面积越大功率越大,但对任何一点最多只张满一个半球,按功率会给它过多样本。光谱尖峰(如荧光灯)可能让功率被低估,作者说实践中没遇到问题。
光源包围 LightBounds
对每个非无穷远光源记录:空间包围盒、功率 、主法线方向 、法线偏离角 、在 之外仍可发光的附加角 、是否双面。与 夹角超过 的方向肯定收不到光。
- 点光源:, 任意;聚光灯: 为朝向, 为内锥、 为衰减带宽度;面光源: 来自
Shape::NormalBounds(),。 - 两个细节:聚光灯的 按各向同性点光源算(),不乘锥角,因为锥已经在重要性函数里计入——否则同样强度的窄锥灯会被少采样;双面面光源的 不乘 2,因为双面也已在重要性里计入(书中图 12.29:去掉这个多余的 2 后 MSE 改善 1.42 倍)。
- 合并两个包围:任一方功率为 0 则直接返回另一方;方向锥取并集, 取较大者(存余弦所以取较小的余弦)。
- 存储:
LightBounds52 字节;CompactLightBounds24 字节:八面体编码单位向量 4 字节(见 球面几何与方向参数化),两个余弦各量化为 15 位并与双面标志打包成 4 字节,包围盒每坐标 16 位共 12 字节, 不压缩。量化都取保守方向:余弦向下取整(角度变大),包围盒下界向下、上界向上取整。
重要性函数
给定着色点 (介质中法线为 0):
- 距离:取包围盒中心的距离平方,但不小于包围盒对角线长度的某个比例,避免点在盒内时 趋于无穷、两个子节点无法比较;
- 角度: 为 与"盒中心→"的夹角, 为盒子相对 的张角,发光端的最小角 ;若 ,重要性为 0;
- 重要性 ,表面上再乘入射余弦的保守上界 。 不调用三角函数:若 返回 1,否则用 。这个重要性等于假设表面是漫反射的,不考虑 BSDF(练习 12.11;Liu 等 2019b 把 BSDF 纳入)。
构建与遍历
- 构建沿用几何 BVH 的分桶 SAH 框架(见 空间数据结构),代价改为 ,其中方向测度 惩罚细长包围盒。笔者对三组 数值积分,与 pbrt 代码中的闭式完全一致。这里没有光线,表面积不再有几何概率的依据;作者认为体积更合理,但表面积实践中更好,因为它惩罚"两维很大、第三维很薄"的盒子,这类盒子张角大、重要性估计不确定。
- 节点
LightBVHNode28 字节,按 32 字节对齐,一条 64 字节 CPU 缓存行放 2 个、128 字节 GPU 缓存行放 4 个;第一个子节点紧跟父节点,只存第二个子节点的下标。 - 采样:无穷远光源(含方向光)不进 BVH,"每个无穷远光源"与"整棵 BVH"等概率;进入 BVH 后在每个内部节点按两子节点重要性用
SampleDiscrete()选一个,并把均匀样本重映射回 继续使用。只走一条路径,不需要栈;叶子的概率是路径上概率的乘积。两个子节点重要性可能都为 0(越往下界越紧),此时不返回光源。 - PMF:建树时为每个光源记录位轨迹 (bit trail)(Laine 2010),最低位表示根节点的选择;求 PMF 时按位确定性地走到叶子并累乘。
与实时渲染的对照与取舍
| 方面 | 实时(分簇/分块着色,见 分簇着色) | PBRT 光源 BVH |
|---|---|---|
| 做法 | 按屏幕/视锥体素确定性地列出影响范围内的光源,逐个累加 | 随机选一个光源并除以概率 |
| 前提 | 光源有有限影响半径(窗口函数截断) | 物理平方反比,不截断 |
| 结果 | 无噪声,成本随每簇光源数线性增长 | 无偏但有噪声,成本近似 |
| 遮挡 | 阴影贴图另算 | 采样不考虑可见性;延伸阅读:ReSTIR(Bitterli 等 2020)时空重采样把可见性纳入,已用于实时光追 |
延伸阅读还列出:Ward 1991、Shirley 等 1996 的早期工作;Wald 等 2003 用低采样率预渲染统计光源贡献;Tokuyoshi–Harada 2016 随机光源剔除;Conty Estevez–Kulla 2018(pbrt 实现的直接来源,另有介质专用重要性和自适应分裂,pbrt 未实现);Iray 也用光源 BVH(Keller 等 2017);Vévoda 等 2018 贝叶斯回归、Guo 等 2020 体素间可见性缓存。
出处
- PBRT 4e source excerpt: chapter 12 (Light Sources)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 12 章 12.6 节与延伸阅读,pbr-book.org/4ed/Light_Sources