跳转到内容

Veach MIS — 用一行加权公式让多种采样策略各取所长

是什么

多重重要性采样(Multiple Importance Sampling,MIS)是一招让你同时跑多种采样策略、再按各自靠谱程度加权合起来的技巧。一行公式:

w_i(x) = (n_i · p_i(x))^β / Σ_j (n_j · p_j(x))^β

日常类比:你在不同天气预报 App 之间不知道信哪个,干脆全都看一遍,然后按”哪个 App 在这种天气下最准”加权平均。Veach 给的就是这个加权公式。

放到渲染里:算一个像素颜色,需要对所有入射光求积分(见 kajiya-1986-rendering-equation)。可以按光源方向采样(“光从哪儿来”),也可以按 BSDF 方向采样(“表面爱反射到哪儿”)。两种各有死穴。MIS 让你同时跑、合权重,方差比单跑任何一个都低。

为什么重要

1995 年之前,路径追踪两个最痛的场景:

  • 小光源 + 漫反射表面:BSDF 采样几乎打不中那一小坨光源 → 噪点炸裂
  • 大光源 + 镜面表面:light 采样能命中光源,但反射方向几乎不对应入射方向 → 贡献几乎为 0

工程师只能”看场景类型决定哪种采样”,或者各跑一半再硬平均——两种方式都会在边界场景出问题。

Veach 的洞察是:两种估计都是无偏的,差别只在方差。把它们按”哪种 pdf 在该样本上更高”加权合并,就能在每一种场景下都接近最优。代价:每条路径多算一次另一种策略的 pdf,几乎零开销

效果:

  • 玻璃球被小面光源照射这种”两种策略各崩一半”的场景,噪点直接降一个数量级
  • 今天 Arnold / Cycles / RenderMan / PBRT / Mitsuba 全都内置 MIS,path tracer 不写 MIS 等于没写

核心要点

三个关键设计

  1. 加权和必须等于 1:w_1 + w_2 + … + w_n = 1,不然估计器有偏。
  2. balance heuristic:β=1 时叫 balance heuristic,Veach 在论文里证明它的方差离理论最优只差一个常数。
  3. power heuristic:β=2 时叫 power heuristic,更激进地把权重压给 pdf 大的那一项。Veach 推荐 β=2,工程上更稳。

直观理解 power heuristic

  • 如果 light sampling 给的 pdf 是 100,BSDF sampling 是 1,那这个样本”应该听 light 的”
  • 权重比 100^2 : 1^2 = 10000:1,等于几乎只用 light 那一项
  • pdf 一旦被某个策略压得很低,它在 MIS 里就被自动边缘化,不会拖累整体

为什么不 max 取最大那个:max 不是连续函数、会让估计器偏差。MIS 的妙处是平滑过渡。

实践案例

案例 1:玻璃球被小光源照射

# 伪代码:估计点 x 上的反射光
def estimate_radiance(x, normal):
# 策略 1:按光源采样
light_dir, p_light = sample_light()
p_bsdf_at_light_dir = bsdf_pdf(light_dir)
contribution_light = bsdf(light_dir) * cos(light_dir, normal) * Le
w_light = p_light**2 / (p_light**2 + p_bsdf_at_light_dir**2)
# 策略 2:按 BSDF 采样
bsdf_dir, p_bsdf = sample_bsdf()
p_light_at_bsdf_dir = light_pdf(bsdf_dir)
contribution_bsdf = bsdf(bsdf_dir) * cos(bsdf_dir, normal) * Le_at(bsdf_dir)
w_bsdf = p_bsdf**2 / (p_light_at_bsdf_dir**2 + p_bsdf**2)
return w_light * contribution_light / p_light + w_bsdf * contribution_bsdf / p_bsdf

注意三件事:

  • 两条路径都跑,最后加权合并
  • 每条路径都要算”另一种策略会以多大概率采到这个点”——这就是 p_bsdf_at_light_dir 那一行
  • 权重之和 = 1

案例 2:β 不同的效果对比

β 值名字行为适用
0平均 heuristic完全平均,等价不带权重几乎没人用
1balance heuristicVeach 证明方差离最优差常数理论分析
2power heuristic工程默认,pdf 高的几乎独占生产环境
maximum heuristic退化成 max(不连续)不可用

PBRT / Mitsuba / Cycles 默认 β=2。

案例 3:今天还在用

打开任何一个 GPU path tracer(如 OptiX / Falcor),grep “MIS” 或 “power heuristic” 都能在 next event estimation 那一段命中这一行公式:

float misWeight = (pLight * pLight) / (pLight * pLight + pBsdf * pBsdf);

30 年前的 SIGGRAPH 论文,原样进了 2026 年的实时渲染管线。

踩过的坑

  1. pdf 度量空间要统一:light sampling 一开始给的是面积空间 pdf(“光源表面单位面积的密度”),BSDF 给的是立体角空间 pdf。必须先把 light 的换算成立体角(除以距离平方、乘 cos),才能放进同一个 MIS 公式比。新人最容易在这里翻车。

  2. n_i 是策略总样本数、不是 1:如果 light 采 4 次、BSDF 采 1 次,公式里 n_light=4、n_bsdf=1。常见 bug:写成 1 和 1,等于无视采样配比,方差反而上升。

  3. delta 分布要单独处理:完美镜面(mirror)和点光源的 pdf 是 delta 函数(无穷大)。MIS 公式里直接代入会爆炸。处理方法:specular bounce 那一段路径不进 MIS,单独累加。今天的 path tracer 都有 isDelta 标志位专门拐弯。

  4. 权重函数任意但要 Σ=1:理论上 w_i 可以是任何函数,只要加起来 = 1 且 p_i=0 时 w_i=0。balance/power 只是其中两种实例。学术界还在研究”哪种 heuristic 在哪种场景下最优”——但工程上 power β=2 是 30 年没动的默认。

适用 vs 不适用场景

适用

  • 任何要把多种采样策略合一的蒙特卡洛积分(不只渲染、金融定价、贝叶斯也用)
  • 渲染里的 next event estimation —— 必装
  • 每种策略各擅长一类积分子区域、互补但都不完美的情况

不适用

  • 只有一种合理采样策略 —— 直接用就行,没必要 MIS
  • 全是 delta 分布(纯镜面世界) —— pdf 退化,要走 specular path 单独累加
  • 策略 pdf 很难解析地求 —— 要凑个公式估 pdf 才行,否则没法算权重

历史小故事(可跳过)

  • 1986:Kajiya 提渲染方程,路径追踪诞生(见 kajiya-1986-rendering-equation)。但小光源场景噪点劝退。
  • 1993:Lafortune 双向路径追踪用”两端发光”减方差(见 lafortune-1993-bdpt),但每一对路径仍要决定怎么合权重。
  • 1995:Veach 在 Stanford 读博,把这个”如何合权重”的问题数学化,给出 power heuristic。SIGGRAPH 这篇 9 页论文是博士论文的预演。
  • 1997:Veach 博士论文完整版(含 BDPT、MLT、MIS),拿 SIGGRAPH 最佳论文,2014 年获奥斯卡技术成就奖——电影工业把这套方法用在《阿凡达》、皮克斯所有片子上。

Veach 后来去了 Google,主导了 AdSense 拍卖系统的设计,是另一段传奇。

学到什么

  1. 多种采样策略各有死穴 → 加权合并即可,不必择优——这是 MC 估计的通用思想,不止渲染
  2. balance/power heuristic 的核心是 pdf 比——pdf 高的策略权重高,自动让”对的人”主导
  3. β=2 比 β=1 工程上更好用:理论 vs 实践之间的微妙差距
  4. 9 页 SIGGRAPH 论文 + 30 年生产环境零修改 —— 工程界少有的”一次写对、终身受用”
  5. kajiya-1986-rendering-equation 互补:Kajiya 给方程、Veach 给”怎么解最不噪”

延伸阅读

关联