零散射与透射率估计
Null Scattering & Transmittance Estimation
透射率 在非均匀介质里没有解析解。直接估计光学厚度 再取指数会因 Jensen 不等式产生偏差;零散射 (null scattering) 用一个常数上界(majorant) 把介质"填满"成均匀介质,得到可无偏采样的积分方程,由此推出 next-flight、比率追踪 (ratio tracking) 和 delta 追踪 (delta tracking) 等估计器。本页对应 PBRT 4e 11.2 与 11.4.3。
为什么"估计 τ 再取指数"有偏
方括号内是 的无偏估计,但 是凸函数,。PBRT 原文说这样会低估透射率,这与 Jensen 不等式的方向相反,见下文「原书问题」。误差随 估计的方差减小而减小;游戏里的光线步进(黎曼和)就是这种有偏做法,见 参与介质与体积散射。
透射率的积分形式
对 在 上积分并除以 : (直接相除得到的是 ;两种写法积分后都等于 ,等式成立,见下文。)这个递归式可以无偏估计,但被积函数难采样、方差大。
零散射与 majorant
定义零散射系数 ,于是 处处为常数,可理解为往介质里加入不影响光的"虚构粒子"直到密度均匀。得到 均匀介质下 ,积分消失,退化为 Beer 定律;非均匀时第一项是低估,积分补上其余部分。笔者用 、、 做数值积分核对:两边都等于 。
距离用指数分布 采样(逆变换见 随机变量变换与逆变换采样)。采到 正好对应"被积函数为 0 的 段",就是递归的终止条件。
三种估计器
| 估计器 | 形式 | 特点 |
|---|---|---|
| next-flight | 均匀介质零方差;非均匀时常不如其他方法高效 | |
| 比率追踪 (ratio tracking) | 在 (11.16) 中取 :,展开为 | pbrt 第 14 章所用;透射率很小后仍继续采样,可配合俄罗斯轮盘 |
| delta 追踪(track-length) | 以概率 继续,否则返回 0;越过 返回 1 | 输出只有 0/1;物理解释:每次碰撞随机判定撞上真粒子(消光)还是虚构粒子(忽略、继续) |
(11.16) 的一般形式:以概率 只估计第一项(除以 ),否则只估计积分(除以 )。比率追踪把"选哪一项"与" 是否越过 "合并,因为 。把俄罗斯轮盘的继续概率设成 ,权重抵消,就得到 delta 追踪。
delta 追踪还能按 的比例采样碰撞位置(书中伪代码):循环采样 ,若 则继续,否则返回该点;越过 则无交互。指数分布无记忆,所以每次从当前点重新采样即可。
majorant 的松紧:分段与 DDA
平均步长是 。若介质大部分 、一小块 ,全局 时稀薄区 99% 的采样是零散射,步长缩短到 1/100。解决办法是空间变化的 majorant:pbrt 的 MajorantGrid 每个体素存该区域最大密度,乘以 得局部 majorant;光线用 3D DDA(Cleary–Wyvill 1988,思路类似 Bresenham,但要找出所有经过的体素)逐体素给出 RayMajorantSegment,由 RayMajorantIterator::Next() 按从前到后的顺序惰性返回(光路在中途散射或终止时,后面的段不必计算)。实现细节:
- 光线先变换到网格的 空间;
deltaT= 体素宽度 / |方向分量|;负零方向分量要改成正零,保证 ,该轴永远不会被选中; - 选下一步的轴:三次比较结果编码成 3 位整数查表
cmpToAxis,无分支; - 书中图 11.19:云模型在 CPU 和 GPU 上都是每边约 64–256 体素最快;太粗 majorant 松、零散射多,太细则 DDA 遍历开销大。
- 其他结构:Yue 等 2010 用 kd 树存 majorant,2011 估计划分效率;Szirmay-Kalos 等 2011 就是逐格 delta 追踪(pbrt 的做法)。
取舍
| 方法 | 偏差 | 代价 | 适用 |
|---|---|---|---|
| 固定步长光线步进(黎曼和) | 有偏,高估透射率 | 步数固定,GPU 友好 | 实时雾、云、大气 |
| 比率追踪 | 无偏 | 步数随 增长 | 离线阴影光线透射率 |
| delta 追踪 | 无偏,只取 0/1,方差较高 | 可提前终止 | 碰撞距离采样 |
| 残差比率追踪(Novák 等 2014) | 无偏 | 需要密度下界 | 用解析部分降低方差 |
| 无偏光线步进(Kettunen 等 2021) | 无偏 | 均匀步进加去偏修正项 | 误差远低于以往的估计器 |
延伸阅读(PBRT 11 章):delta 追踪由 Raab 等 2006 引入图形学,在多个领域被独立发明过(Kutz 等 2017、Kettunen 等 2021 有史料);积分形式推导沿用 Georgiev 等 2019,Galtier 等 2013 也给出过;Kulla–Fajardo 2012 按"透射率 × 散射系数"制表采样;Villemin 等 2018 提高稀薄介质的采样密度。
原书问题
- 11.2 节"underestimate"方向写反:书中说 (11.8) 这类估计"会低估透射率",并以 Jensen 不等式和 的凸性为据。但对凸函数 Jensen 不等式给出 ,也就是平均起来是高估。笔者用 、、均匀采样 做蒙特卡洛:真值 ,,确实偏高。来源:Jensen 不等式(凸函数 有 ,任何概率论教材);计算可复现。
- (11.10) 推导措辞:按文中"把 (11.9) 除以 "得到的积分号内是 ,书中写的是 。两者积分后都等于 ,所以方程本身正确,只是推导一步没写出来(Georgiev 等 2019 两种形式都有)。
- delta 追踪的轮盘概率措辞:书中说把俄罗斯轮盘的"终止概率"设为 ,但式 (11.18) 是以该概率继续;终止概率应为 (上表按公式写的是继续概率)。
分段 majorant 下的采样(PBRT 4e 14.1.3)
介质给出的是沿光线分段常数的 majorant,光学厚度分段线性, 连续、单调递减,但在段边界处一阶导数不连续,且 。SampleT_maj() 逐段采样:在第 段按 采指数距离,落在段内就以该点调用回调(估计量化简为 ),否则把整段透射率乘进累计值,进入下一段;所有段都没采到的概率正好是从 到 的总 ,即 (14.7) 中选择表面项所需的概率。实现要点:
- 先把光线方向归一化,使参数 就是距离;按介质具体类型(
TaggedPointer::Dispatch+ 泛型 lambda)在栈上声明迭代器,避免动态分配和虚调用; - 只用第一个波长的 majorant 采样,其他波长靠光谱 MIS(见 参与介质与体积散射);第一个波长 majorant 为 0 的段直接跳过,但仍要为其他波长累乘透射率;
tMax为无穷时改成最大有限浮点数,避免 ; - 第一个均匀样本来自 Sampler,用掉后立即由 RNG 补充,保证样本维度消耗固定;
- 回调返回 true 表示从当前点重新开始(累计 重置为 1),返回 false 结束;函数最终返回最后一个采样点到
tMax的 。 - 练习 14.3:可只用一个均匀数采样总光学厚度,再沿光线找到累计到该值的位置。
- 原书在本节的推导式 (14.8) 有多余的 因子,并把 写成 ,两处错误互相抵消,详见 参与介质与体积散射 的「原书问题(第 14 章)」。
出处
- PBRT 4e source excerpt: chapter 11 (Volume Scattering)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 11 章 11.2、11.4.3 节与延伸阅读,pbr-book.org/4ed/Volume_Scattering
- PBRT 4e source excerpt: chapter 14 (Light Transport II Volume Rendering)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 14 章 14.1.3 节,pbr-book.org/4ed/Light_Transport_II_Volume_Rendering