中EN
概念页

零散射与透射率估计

Null Scattering & Transmittance Estimation

透射率 Tr=e−τT_r=e^{-\tau} 在非均匀介质里没有解析解。直接估计光学厚度 τ\tau 再取指数会因 Jensen 不等式产生偏差;零散射 (null scattering) 用一个常数上界(majorant)σmaj\sigma_{maj} 把介质"填满"成均匀介质,得到可无偏采样的积分方程,由此推出 next-flight、比率追踪 (ratio tracking) 和 delta 追踪 (delta tracking) 等估计器。本页对应 PBRT 4e 11.2 与 11.4.3。

为什么"估计 τ 再取指数"有偏

Tr(p→p′)=e−∫0dσt(p+tω) dt≈e−σt(p+t′ω)/p(t′)T_r(p\to p')=e^{-\int_0^d\sigma_t(p+t\omega)\,dt}\approx e^{-\sigma_t(p+t'\omega)/p(t')} 方括号内是 τ\tau 的无偏估计,但 e−xe^{-x} 是凸函数,E[e−X]≥e−E[X]E[e^{-X}]\ge e^{-E[X]}。PBRT 原文说这样会低估透射率,这与 Jensen 不等式的方向相反,见下文「原书问题」。误差随 τ\tau 估计的方差减小而减小;游戏里的光线步进(黎曼和)就是这种有偏做法,见 参与介质与体积散射。

透射率的积分形式

对 dL/dt=−σtLdL/dt=-\sigma_tL 在 [0,d][0,d] 上积分并除以 L(p)L(p): Tr(p→p′)=1−∫0dσt(p+tω) Tr(p+tω→p′) dt(11.10)T_r(p\to p')=1-\int_0^d\sigma_t(p+t\omega)\,T_r(p+t\omega\to p')\,dt\quad(11.10) (直接相除得到的是 Tr(p→p+tω)T_r(p\to p+t\omega);两种写法积分后都等于 1−Tr1-T_r,等式成立,见下文。)这个递归式可以无偏估计,但被积函数难采样、方差大。

零散射与 majorant

定义零散射系数 σn=σmaj−σt≥0\sigma_n=\sigma_{maj}-\sigma_t\ge0,于是 σa+σs+σn=σmaj\sigma_a+\sigma_s+\sigma_n=\sigma_{maj} 处处为常数,可理解为往介质里加入不影响光的"虚构粒子"直到密度均匀。得到 Tr(p→p′)=e−σmajd+∫0de−σmajt σn(p+tω) Tr(p+tω→p′) dt(11.13)T_r(p\to p')=e^{-\sigma_{maj}d}+\int_0^d e^{-\sigma_{maj}t}\,\sigma_n(p+t\omega)\,T_r(p+t\omega\to p')\,dt\quad(11.13) 均匀介质下 σn=0\sigma_n=0,积分消失,退化为 Beer 定律;非均匀时第一项是低估,积分补上其余部分。笔者用 σt(t)=1+sin⁡t\sigma_t(t)=1+\sin t、d=3d=3、σmaj=2.1\sigma_{maj}=2.1 做数值积分核对:两边都等于 0.00680570.0068057。

距离用指数分布 pmaj(t)=σmaje−σmajtp_{maj}(t)=\sigma_{maj}e^{-\sigma_{maj}t} 采样(逆变换见 随机变量变换与逆变换采样)。采到 t′>dt'>d 正好对应"被积函数为 0 的 [d,∞)[d,\infty) 段",就是递归的终止条件。

三种估计器

估计器形式特点
next-flighte−σmajd+{σnσmajTr(p+t′ω→p′)t′<d0否则e^{-\sigma_{maj}d}+\begin{cases}\frac{\sigma_n}{\sigma_{maj}}T_r(p+t'\omega\to p')&t'<d\\0&\text{否则}\end{cases}均匀介质零方差;非均匀时常不如其他方法高效
比率追踪 (ratio tracking)在 (11.16) 中取 pe=e−σmajdp_e=e^{-\sigma_{maj}d}:{1t′>dσnσmajTr(⋅)否则\begin{cases}1&t'>d\\\frac{\sigma_n}{\sigma_{maj}}T_r(\cdot)&\text{否则}\end{cases},展开为 ∏iσn(ti)/σmaj\prod_i\sigma_n(t_i)/\sigma_{maj}pbrt 第 14 章所用;透射率很小后仍继续采样,可配合俄罗斯轮盘
delta 追踪(track-length)以概率 σn/σmaj\sigma_n/\sigma_{maj} 继续,否则返回 0;越过 dd 返回 1输出只有 0/1;物理解释:每次碰撞随机判定撞上真粒子(消光)还是虚构粒子(忽略、继续)

(11.16) 的一般形式:以概率 pep_e 只估计第一项(除以 pep_e),否则只估计积分(除以 1−pe1-p_e)。比率追踪把"选哪一项"与"t′t' 是否越过 dd"合并,因为 P(t′>d)=e−σmajdP(t'>d)=e^{-\sigma_{maj}d}。把俄罗斯轮盘的继续概率设成 σn/σmaj\sigma_n/\sigma_{maj},权重抵消,就得到 delta 追踪。

delta 追踪还能按 σt(t)Tr(t)\sigma_t(t)T_r(t) 的比例采样碰撞位置(书中伪代码):循环采样 t+=SampleExponential(u,σmaj)t\mathrel{+}=\text{SampleExponential}(u,\sigma_{maj}),若 u<σn/σmaju<\sigma_n/\sigma_{maj} 则继续,否则返回该点;越过 dd 则无交互。指数分布无记忆,所以每次从当前点重新采样即可。

majorant 的松紧:分段与 DDA

平均步长是 1/σmaj1/\sigma_{maj}。若介质大部分 σt=1\sigma_t=1、一小块 σt=100\sigma_t=100,全局 σmaj=100\sigma_{maj}=100 时稀薄区 99% 的采样是零散射,步长缩短到 1/100。解决办法是空间变化的 majorant:pbrt 的 MajorantGrid 每个体素存该区域最大密度,乘以 σt\sigma_t 得局部 majorant;光线用 3D DDA(Cleary–Wyvill 1988,思路类似 Bresenham,但要找出所有经过的体素)逐体素给出 RayMajorantSegment,由 RayMajorantIterator::Next() 按从前到后的顺序惰性返回(光路在中途散射或终止时,后面的段不必计算)。实现细节:

  • 光线先变换到网格的 [0,1]3[0,1]^3 空间;deltaT = 体素宽度 / |方向分量|;负零方向分量要改成正零,保证 1/0=+∞1/0=+\infty,该轴永远不会被选中;
  • 选下一步的轴:三次比较结果编码成 3 位整数查表 cmpToAxis,无分支;
  • 书中图 11.19:云模型在 CPU 和 GPU 上都是每边约 64–256 体素最快;太粗 majorant 松、零散射多,太细则 DDA 遍历开销大。
  • 其他结构:Yue 等 2010 用 kd 树存 majorant,2011 估计划分效率;Szirmay-Kalos 等 2011 就是逐格 delta 追踪(pbrt 的做法)。

取舍

方法偏差代价适用
固定步长光线步进(黎曼和)有偏,高估透射率步数固定,GPU 友好实时雾、云、大气
比率追踪无偏步数随 σmajd\sigma_{maj}d 增长离线阴影光线透射率
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 不等式和 e−xe^{-x} 的凸性为据。但对凸函数 Jensen 不等式给出 E[e−X]≥e−E[X]E[e^{-X}]\ge e^{-E[X]},也就是平均起来是高估。笔者用 σt(t)=1+sin⁡(5t)\sigma_t(t)=1+\sin(5t)、d=2d=2、均匀采样 t′t' 做蒙特卡洛:真值 Tr=0.0937T_r=0.0937,E[e−τ^]≈0.223E[e^{-\hat\tau}]\approx0.223,确实偏高。来源:Jensen 不等式(凸函数 φ\varphi 有 E[φ(X)]≥φ(E[X])E[\varphi(X)]\ge\varphi(E[X]),任何概率论教材);计算可复现。
  • (11.10) 推导措辞:按文中"把 (11.9) 除以 L(p)L(p)"得到的积分号内是 Tr(p→p+tω)T_r(p\to p+t\omega),书中写的是 Tr(p+tω→p′)T_r(p+t\omega\to p')。两者积分后都等于 1−Tr(p→p′)1-T_r(p\to p'),所以方程本身正确,只是推导一步没写出来(Georgiev 等 2019 两种形式都有)。
  • delta 追踪的轮盘概率措辞:书中说把俄罗斯轮盘的"终止概率"设为 σn/σmaj\sigma_n/\sigma_{maj},但式 (11.18) 是以该概率继续;终止概率应为 σt/σmaj\sigma_t/\sigma_{maj}(上表按公式写的是继续概率)。

分段 majorant 下的采样(PBRT 4e 14.1.3)

介质给出的是沿光线分段常数的 majorant,光学厚度分段线性,TmajT_{maj} 连续、单调递减,但在段边界处一阶导数不连续,且 Tmaj=∏iTmajiT_{maj}=\prod_iT^i_{maj}。SampleT_maj() 逐段采样:在第 ii 段按 σmaji\sigma^i_{maj} 采指数距离,落在段内就以该点调用回调(估计量化简为 f(p′)f(p')),否则把整段透射率乘进累计值,进入下一段;所有段都没采到的概率正好是从 00 到 tt 的总 TmajT_{maj},即 (14.7) 中选择表面项所需的概率。实现要点:

  • 先把光线方向归一化,使参数 tt 就是距离;按介质具体类型(TaggedPointer::Dispatch + 泛型 lambda)在栈上声明迭代器,避免动态分配和虚调用;
  • 只用第一个波长的 majorant 采样,其他波长靠光谱 MIS(见 参与介质与体积散射);第一个波长 majorant 为 0 的段直接跳过,但仍要为其他波长累乘透射率;tMax 为无穷时改成最大有限浮点数,避免 0×∞=NaN0\times\infty=\text{NaN};
  • 第一个均匀样本来自 Sampler,用掉后立即由 RNG 补充,保证样本维度消耗固定;
  • 回调返回 true 表示从当前点重新开始(累计 TmajT_{maj} 重置为 1),返回 false 结束;函数最终返回最后一个采样点到 tMax 的 TmajT_{maj}。
  • 练习 14.3:可只用一个均匀数采样总光学厚度,再沿光线找到累计到该值的位置。
  • 原书在本节的推导式 (14.8) 有多余的 σmaj1\sigma^1_{maj} 因子,并把 Pr⁡{t1′>t1}\Pr\{t'_1>t_1\} 写成 σmaj1Tmaj1\sigma^1_{maj}T^1_{maj},两处错误互相抵消,详见 参与介质与体积散射 的「原书问题(第 14 章)」。
  1. PBRT 4e source excerpt: chapter 11 (Volume Scattering)
  2. 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
  3. PBRT 4e source excerpt: chapter 14 (Light Transport II Volume Rendering)
  4. 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

相关页面

图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学蒙特卡洛积分与重要性采样Monte Carlo Integration & Importance Sampling渲染方程里的半球积分没有闭式解,只能数值积分。蒙特卡洛积分在定义域里随机取样、按概率密度加权求平均,期望值正好等于积分真值,误差随样本数 N 按 1/\sqrt{N} 下降,而且与积分维数无关,所以成了光线追踪类渲染的数学基础。降低误差的主要手段是让采样分布接近被积函数的形状,也就是重要性采样(GEA4 卷 II 12.6.2、12.6.4)。游戏数学随机变量变换与逆变换采样Random Variable Transforms & Inversion Sampling蒙特卡洛估计器要求能从指定的概率密度里抽样。最基本的工具是逆变换法 (Inversion Method):对 CDF 求逆,把 [0,1) 上的均匀随机数映射成目标分布;更一般地,随机变量经过一一映射后的密度由导数(多维时是雅可比行列式)决定;多维非独立分布则先采边缘密度、再采条件密度。本页按 PBRT 第 4 版 2.1.1、2.3、2.4 节整理,是 蒙特卡洛积分与重要性采样 的数学部分。图形学体素Voxels体素是"体积元素",表示均匀三维网格中的一块空间,位置由网格索引隐含。体素是存储体积数据的传统方式,可存占用位、密度、颜色、法线、有向距离等。数据量按分辨率立方增长,常用稀疏体素八叉树 (SVO) 等结构压缩;可由 GPU 体素化生成,并通过光线投射、转多边形、移动立方体或等值面/水平集光线追踪来渲染(RTR4 13.10 节)。图形学天空与云渲染Sky & Cloud Rendering天空颜色和空气透视来自空气分子的瑞利散射,太阳周围的光晕来自近地大颗粒的米氏散射。实时方案有解析拟合模型和基于预计算透射率/散射查找表的物理模型;云则从全景贴图、粒子发展到用程序化噪声构建、光线步进的参与介质层,并以倍频程近似多次散射(RTR4 14.4 节)。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。

输入关键词开始搜索

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