随机变量变换与逆变换采样
Random Variable Transforms & Inversion Sampling
蒙特卡洛估计器要求能从指定的概率密度里抽样。最基本的工具是逆变换法 (Inversion Method):对 CDF 求逆,把 上的均匀随机数映射成目标分布;更一般地,随机变量经过一一映射后的密度由导数(多维时是雅可比行列式)决定;多维非独立分布则先采边缘密度、再采条件密度。本页按 PBRT 第 4 版 2.1.1、2.3、2.4 节整理,是 蒙特卡洛积分与重要性采样 的数学部分。
概率论基本概念(PBRT 2.1.1)
- 随机变量 :由随机过程选出的值,定义域可离散可连续; 仍是随机变量。
- 概率质量函数 (PMF) 给离散变量各取值的概率,例如骰子 ;均匀指所有取值等概率。
- 独立:;相依:(式 2.1,条件概率)。
- 标准均匀随机变量 :渲染里一切采样的原料,既容易由伪随机数生成器得到(见 伪随机数生成),又能映射成任意分布。离散选择:若 则选第 个(式 2.2)。例如按功率 选光源。
- 累积分布函数 (CDF) (式 2.3),骰子 。
- 概率密度函数 (PDF) :非负、在定义域上积分为 1,但单点的值可以大于 1;区间概率 。 的 PDF 在 上为 1、其余为 0。
- 期望 (式 2.4),线性:、和的期望等于期望的和(式 2.5)。例: 上均匀时 。
离散逆变换(PBRT 2.3.1)
把 PMF 的柱子从左往右叠起来得到离散 CDF ,选满足 的 (式 2.19),即"对 CDF 求逆":均匀样本落到某根柱子上的概率正好等于柱高。
- pbrt 的
SampleDiscrete()接受未归一化的权重:先求权重和,把 乘以总和得 (浮点舍入使 等于总和时退到下一个更小的浮点数),再线性扫描找区间;每次采样 。要大量采样时改用 的别名表AliasTable(附录 A.1)。 - 样本复用:落在区间 内的相对位置 本身又是一个 均匀数,可以返回给调用者继续使用(
uRemapped)。对第 8 章的高质量低差异样本,复用比重新取一维更好。
连续逆变换(PBRT 2.3.2)
步骤:① 积分 PDF 得 CDF ;② 取 ;③ 解 ,即 。
连续逆变换采样把均匀随机数经 CDF 的逆映射成目标分布上的样本。
flowchart LR U["U ~ Uniform 0,1"] --> CDF["计算或查表 CDF⁻¹"] CDF --> X["X = CDF⁻¹(U) ~ 目标分布"] PDF["目标 PDF / CDF"] --> CDF
例:线性函数 ,,。积分 ,所以
直接求逆得 ,但 时是 0/0;pbrt 用分子有理化后的等价式
并用 std::min 把结果钳到 1 以下(舍入可能得到 1,而下游代码依赖 )。本页用 抽 个样本复核:直方图 0.625/0.873/1.123/1.378 与理论 PDF 0.625/0.875/1.125/1.375 吻合, 与经验频率 0.1951 吻合。pbrt 通常还提供采样的逆函数(返回产生某个 的 ,一维时就是 CDF),便于第 8 章之外的用途。
随机变量的变换(PBRT 2.4)
若 且 一一映射(导数严格同号),则 CDF 相等 ,求导得
例:(),,则 (本页用 抽样后取正弦,直方图与此式吻合)。反过来,要把 变成 ,取 ; 均匀时就退化为逆变换法。
多维:, 为双射,
是雅可比矩阵行列式的绝对值。
- 极坐标 :,所以 (式 2.22)。
- 球坐标:,(式 2.23)。这正是"直接均匀取 在球面上不均匀"的原因(GEA 的半球均匀采样例子同理,见 蒙特卡洛积分与重要性采样)。
多维采样:边缘密度与条件密度(PBRT 2.4.2)
可分离时 ,各维独立采样即可。不可分离时:
- 边缘密度 (式 2.24),"积掉"其他维;
- 采 后,从条件密度 采 ;
- 更高维依次类推,每次少一维。
不可分离的多维密度按「先边缘、后条件」逐维降维采样。
flowchart TD Joint["联合密度 p(x,y)"] --> Marg["边缘 p(x) = ∫ p(x,y) dy"] Marg --> Sx["采样 X ~ p(x)"] Sx --> Cond["条件 p(y|x) = p(x,y)/p(x)"] Cond --> Sy["采样 Y ~ p(y|x)"] Sy --> Out["得到 (X,Y)"]
例:双线性函数 (式 2.25, 位于 ),。先采 的边缘密度 ,再采 ,两步都是线性函数,用上面的 SampleLinear();求逆时按相反顺序套两次线性的逆。更多例子(球面、半球、圆盘等)在附录 A.5。
在游戏开发中的用途
- 按权重/功率选光源、按亮度选环境贴图像素(离散逆变换或别名表)。
- 生成 GGX/余弦分布的方向(连续逆变换 + 球坐标雅可比),见 微表面理论。
- 写采样代码时最常见的 bug 是漏掉雅可比因子(如球面上的 )或 PDF 未归一化。
取舍
- 逆变换法要求 CDF 可解析积分并可求逆;做不到时改用表格化分段常数分布、别名表或拒绝采样(附录 A)。
- 逆变换是保序(单调)映射,能保留低差异样本的分层结构。PBRT 2.3 节引言只说逆变换"配合第 8 章分布良好的样本特别有效";把这一点解释为单调映射保分层、并据此说它优于拒绝采样,是本页的归纳。
- 数值稳定性要单独处理:0/0 的等价变形、结果钳到 。
PBRT 的视角:半向量变换的雅可比(PBRT 4e 9.6.5、9.7)
微表面 BSDF 先采样法线 ,再用反射或折射得到 ,所以 的密度要用变量替换 。
- 平面情形:,。
- 三维反射:取以 为极轴的球坐标,镜面反射意味着 、:
- 折射:广义半向量 ,雅可比为 (Walter 等 2007)。PBRT 网页版对这一式的化简有笔误,见 微表面理论。
- 同一思想也用在测量 BRDF 上:把采样映射当作参数化,存 而不是 ,见 测量 BRDF 与数据驱动反射模型。
PBRT 的视角:附录 A 的采样工具箱(PBRT 4e A.3–A.5)
拒绝采样(A.3)
若已知可采样的 与常数 使 ,则反复采 、,当 时接受。几何意义:点 落在 下方。效率取决于 包络 的紧密程度。例:在外接正方形里采点、落在圆盘内才接受,接受率 ;推广到 维超球时体积比趋于 0,越来越低效。pbrt 的蒙特卡洛算法都不用它,因为更希望把分布良好的 样本确定性地映射过去;但它很适合调试:怀疑某个逆变换采样有错时,换成拒绝采样实现,看估计值是否收敛到同一结果(von Neumann 1951 提出)。
一维函数(A.4)
| 分布 | 要点 |
|---|---|
| 帐篷函数 | 先用 SampleDiscrete() 以 1/2 概率选左右并复用均匀数,再采线性函数;构造保证 、 单调无跳变,保留低差异样本的分布 |
| 指数 , | ,。不要化简成 : 可以是 0(基数逆序列尤其容易产生 0)但不会是 1 |
| 高斯 | CDF 用误差函数表示,, 用多项式近似;Box–Muller 用两个均匀数得到两个正态样本:极坐标下 、 |
| 逻辑斯谛 | 形状像高斯但可直接求逆,; 时与 的高斯最接近(最小二乘拟合)。pbrt 的毛发模型使用它 |
| 区间 上的截断 | ;采样时把 线性插值到 再用原逆函数 |
| 不可求逆的 CDF | 用 Newton–二分法解 ;例:smoothstep ,,(见下方原书问题),要解四次方程 |
分段常数 PiecewiseConstant1D | 取 定义 PDF,累加得 个 CDF 值;二分找 cdf[o] ≤ u < cdf[o+1],在段内线性插值;函数全为 0 时改用线性 CDF(图像中全黑的扫描线会出现这种情况);Invert() 直接按位置插值 CDF |
多维(A.5)
- 圆盘: 是错的(样本聚在圆心);由 得 、。但这种映射扭曲面积,会让分层样本的层不紧凑;同心映射(Shirley–Chiu 1997)把同心正方形映到同心圆,如右侧楔形 、,实现采用 Shirley 2011 博客中 Dave Cline 与评论者 "franz" 的简化。
- 均匀半球/球:,可分离,(用 替换 );球面为 ,,PDF 。pbrt 所有方向 PDF 都相对立体角。
- 余弦加权半球(Malley 方法):在圆盘上均匀采样再竖直投影到半球;,雅可比 ,得 ,即立体角 PDF 。任何均匀圆盘采样(包括同心映射)都适用。
- 圆锥内均匀:,。
- 分段常数 2D(
PiecewiseConstant2D):先按行积分得边缘分布 采样行,再用该行的条件分布 采样列;PDF 是两者之积。每行直接交给PiecewiseConstant1D(常数因子 、 不影响归一化),用于环境贴图采样(见 基于图像的光照)。 - 加窗分段常数 2D(
WindowedPiecewiseConstant2D,供PortalImageInfiniteLight使用):借助求和面积表 (summed-area table)(Crow 1984)在常数时间算任意矩形上的积分;边缘 CDF 的分子分母都可由表求得,再用SampleBisection()二分到同一离散层后按分段线性闭式求解;条件分布把 范围限制在采到的那一层上,仍用二维积分求。求差时用double防止大数相减的灾难性抵消。表中存的是各格右上角的累计和,边界上的 0 不存,所以查询时不加 0.5 像素偏移。Bitterli 等 2015 首先把求和面积表用于图像矩形区域的采样。 - 与 RTR4 的关系:纹理过滤与 Mipmap 中求和面积表用于各向异性纹理过滤(求矩形区域平均值),这里用于重要性采样(求矩形区域积分并反演 CDF),同一数据结构、不同用途。
- 其他表格化多维采样:Steigleder–McCool 2003 用 Hilbert 曲线把多维域线性化为一维(见 莫顿码与空间填充曲线);McCool–Harwood 1997、Clarberg 等 2005 的四叉树逐级变换;Vitsas 等 2021 用截断高斯混合拟合晴空环境贴图。
原书问题(附录 A)
- A.4.6 smoothstep 的 CDF:正文(SVG 已解码确认)写作 ,多除了 。由 、 得 ,在 处为 1;书中写法在 处等于 。代码
SampleSmoothStep()用的是正确的 。笔者取 数值积分 PDF 得 0.26081,与 一致,书中写法给出 0.08694。 InvertSmoothStepSample()代码缺陷:其中的 lambdaP = [&](Float x){ return 2*Pow<3>(t) - Pow<4>(t); }忽略参数、始终使用外层的 ,所以 ,返回 。笔者于 2026-10-13 PT 查看 GitHub 上 pbrt-v4 master 的src/pbrt/util/sampling.h,第 305–309 行仍是这样。由于 、,正确实现就是直接返回 。- A.3 说"效率取决于预期被拒绝样本的比例……即圆盘面积除以正方形面积 ", 是接受率,拒绝率约 21.5%。
- 在线版 A.1 开头有一处脚注渲染错乱(只剩 "8.1.3.")。延伸阅读中 "rectangluar" 为笔误。
- 在线版公式编号塌缩:附录 A 的 11 个带编号公式(A.4 的指数 CDF、指数采样距离、高斯、logistic、区间 PDF、截断 logistic CDF、分段积分,A.5 的二维离散边缘/条件密度、均匀半球采样、求和面积表定义)在 HTML 中的 eqno 全部显示为 "(A.17)",正文中 "用 Equation (A.17) 计算条件密度……再用 Equation (A.17) 计算边缘密度" 之类的引用因此无法区分(附录 B 的 5 个公式同样全部标为 "(B.18)")。这是在线版的渲染/编号缺陷,阅读时应按锚点名(如 eq:2d-discrete-marginal-density)对应。(据 pbr-book.org/4ed 附录 A、B 页面 HTML 源码核对,2026-10-13)
出处
- PBRT 4e source excerpt: chapter 02 (Monte Carlo Integration)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 2 章 2.1.1、2.3、2.4 节,pbr-book.org/4ed/Monte_Carlo_Integration
- PBRT 4e source excerpt: chapter 09 (Reflection Models)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 9 章 9.1–9.9 节,pbr-book.org/4ed/Reflection_Models
- PBRT 4e source excerpt: chapter A (Sampling Algorithms)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)附录 A A.3–A.5 节,pbr-book.org/4ed/Sampling_Algorithms