Lafortune-Willems 1993 — 从相机和光源同时撒光线再"接龙"
是什么
双向路径追踪(Bidirectional Path Tracing,BDPT 雏形):渲染图像时同时从相机和光源出发各自走出一条光线路径,再把两条路径上的点两两连一根线段,每个连接都贡献一份对像素的估计。
日常类比:朋友约你吃饭,地点你不知道。
- 单向(普通路径追踪):你从家出发瞎走,希望撞到他家——大概率走丢
- 双向:你出门,同时朋友也出门,两人各走几步,然后掏手机直接对接位置——一定接得上
Lafortune-Willems 1993 是这个想法第一次正式发表的论文,比 Veach 1997 那个被工业广泛引用的版本早 4 年。
为什么重要
普通路径追踪(Kajiya 1986)从相机往场景里打光线,希望某条路径正好碰到光源。问题:
- 焦散(caustics,玻璃杯在桌上聚出的亮斑):光要先碰玻璃折射、再到桌面、再到相机——从相机回溯撞到一个点光源的概率几乎为 0
- 小光源 + 大场景:路径基本都浪费
- 多次漫反射间接光:每多弹一次衰减一次,单向追踪没耐心走那么深
结果是图像满屏萤火虫噪点(firefly),要消除得跑几小时几天。
BDPT 的洞见:光源那侧也撒路径,然后让两侧路径的端点直接连接。一根连接线相当于一次”空中接力”,原本几乎不可能的路径现在变成”两半各自简单 + 一次可见性测试”。采样概率被人为抬高几个数量级。
后果:
- 焦散、间接照明、复杂多次反弹 —— 方差大幅下降,同样的视觉质量下采样数能省一个数量级
- Veach 1997 在此基础上加了多重要性采样(MIS),变成 PBRT / Mitsuba / Arnold 这些离线渲染器的标配
- 工业管线里凡是看到”BDPT”开关,本质都是这套思想
- 之后的 Metropolis Light Transport(Veach-Guibas 1997)、UPS/VCM(统一路径采样 + 顶点连接合并 2012)都是 BDPT 的直接后裔
核心要点
BDPT 跑一次的步骤:
-
眼路径(eye/camera path):从相机出发,按 BRDF 重要性采样,弹 $t$ 次,得到顶点 $z_0=$ 相机, $z_1, z_2, \dots, z_t$。每弹一次都用俄罗斯轮盘赌(Russian roulette)决定是否继续,避免无限弹射。
-
光路径(light path):从光源出发(按光源功率采样),弹 $s$ 次,得到顶点 $y_0=$ 光源点, $y_1, y_2, \dots, y_s$。光路径不直接贡献像素,而是当作”半成品”等着被连接。
-
逐对连接:对每个 $(s, t)$ 组合,把 $y_s$ 和 $z_t$ 之间连一根阴影线(shadow ray),如果互相可见,这条拼接路径就是一个完整的 light → eye 路径,可以贡献到像素。每条连接都要乘上两端的 BRDF 值 + 几何项 + 可见性。
-
求和:所有 $(s, t)$ 组合的贡献加起来,得到这一次采样对像素的估计。一次双向采样最多能产生 $(s+1)(t+1)$ 条拼接路径。
每一对 $(s, t)$ 组合代表一种”分工方式”,比如:
- $(s=0, t=$ 长 $)$ ≈ 普通路径追踪(光源端不出力,只看眼路径自己撞到光源)
- $(s=$ 长 $, t=0)$ ≈ 光子追踪(light tracing,光源端走完后直接连相机镜头)
- $(s=1, t=$ 长 $)$ ≈ “next-event estimation”(每弹一次主动连一下光源)—— 这是 BDPT 的特例
- $(s, t)$ 都很长 ≈ 真正的”两端各走深、空中连一根” —— BDPT 的独门武器
BDPT 不是替代某个,而是把所有这些策略当成不同的估计器,全跑一遍再合起来。
实践案例
案例 1:玻璃球焦散
普通 PT 1024 spp(每像素采样数):玻璃球下方桌面上的亮斑充满白色噪点,要 16k spp 才干净。 BDPT 1024 spp:亮斑光滑可用。原因:光源端先把光线送进玻璃球折射出去,再和从相机出发的桌面采样点连接 —— 一步就构造出了”光 → 玻璃 → 桌面 → 相机”的完整路径。
案例 2:从门缝漏出的光
房间外面有强光,房间内只有一道狭窄门缝。
- 普通 PT:相机方向几乎所有路径都撞墙,永远走不到门缝外的光源
- BDPT:光源端的路径先穿出门缝进入房间内,相机端的房间内采样点直接连过去 —— 一根阴影线就完成了
案例 3:每对 $(s, t)$ 是一种估计器
设眼路径有 4 个顶点,光路径有 3 个顶点,那么有 $4 \times 3 = 12$ 种连接组合,每种组合都给像素一份估计。这在 1993 论文里直接平均;Veach 1997 改成”按各自概率密度做加权平均(MIS)“,让坏估计自动被压低权重 —— 这是 BDPT 真正鲁棒的关键。
案例 4:和”普通 PT + next-event estimation”的关系
普通工业路径追踪器一定会做 NEE(每弹一次主动连一下光源),这就是 $s=1$ 那一支。BDPT 等于把 NEE 推广到 $s=2, 3, \dots$ —— 让光源端也能多走几步,再和眼路径连接。所以”BDPT 看作 NEE 的多步化”是一个准确的直觉。
案例 5:从一次双向采样到一帧图像
实现里,每个像素的最终估计 = “本像素 K 次双向采样的均值”。每次双向采样要:
- 生成两条路径(眼路径打到摄像机镜头里那个像素,光路径起点采样自光源)
- 枚举所有 $(s, t)$ 对,可见就累加贡献
- 注意:光路径上的某些 $(s, t)$ 组合贡献的不一定是”当前像素”——比如 $t=1$ 时,光路径直接连到镜头,这条贡献会落到另一个像素上。这种”溅射式”贡献叫 light splat。
光线追踪框架要支持”任意像素被任意采样溅射写入”,比朴素 PT 复杂一截,是 BDPT 工程实现的另一个门槛。
踩过的坑
-
“双向”不是把同一根光线两头走:是两条独立的路径各自从相机和光源出发,再两两配对。新人常误以为是一根光线的反向延伸。
-
直接平均 vs MIS:1993 原版直接平均所有 $(s, t)$ 估计,方差能降但还不够鲁棒;某些 $(s, t)$ 在某些场景下方差极大,把整体拉爆。Veach 1997 用 MIS(power heuristic)按密度加权,才让 BDPT 真正稳。
-
完美镜面 + 点光源仍然失效:两端连接需要 $y_s \to z_t$ 这条线段在 BRDF 下有非零密度。如果 $y_s$ 是镜面反射点 + $z_t$ 是另一个镜面点,连接线方向几乎不可能恰好满足两端的 delta 函数 —— 这种路径 BDPT 也撑不住,要 Metropolis Light Transport(Veach-Guibas 1997)。
-
光源采样要正确加权:光路径起点不是均匀采样,而是按光源功率重要性采样,这个加权一旦算错,整张图能量守恒崩坏。
-
可见性测试是热点:每对 $(s, t)$ 都要打一根 shadow ray,路径长 = 10 时一次采样要 100 次可见性测试。GPU BDPT 实现里这步是主要瓶颈。
-
能量复用陷阱:眼路径和光路径重用了同一个随机数序列会在 $(s, t)$ 不同组合里产生相关性偏差,理论方差分析会假。工程实现要么彻底独立采样,要么用专门的相关性补偿(Veach 1997 给了规整推导)。
适用 vs 不适用场景
适用:
- 焦散、间接照明、室内多次弹射的离线渲染
- 小光源 + 大场景(光源贡献稀疏的场景)
- 中等粗糙度材质 + 需要物理正确的 GI(global illumination)
- 离线影视渲染、产品级渲染(Arnold / RenderMan / V-Ray 都内建)
不适用:
- 实时渲染(每像素几十次 shadow ray 太贵)→ 用光栅 + 屏幕空间近似 + RTX 神经降噪
- 全镜面 + 点光源场景(路径连接几乎不能存在)→ 用 MLT / 光子映射
- 仅直接光照(连 PT 都过剩)→ 简单 next-event estimation 即可
- 路径预算极少(spp ≤ 4,比如 GPU 实时去噪输入)→ BDPT 的多估计器开销反而拖慢
历史小故事(可跳过)
- 1986:Kajiya 提出渲染方程 + 第一版蒙特卡洛路径追踪。一切的起点。
- 1989-1992:Heckbert 的光子映射雏形、Pattanaik 的双向估计器讨论。“两端采样”的想法在学术社区流传但未成形。
- 1993:Lafortune(鲁汶大学博士生)和导师 Willems 在 CompuGraphics 发表”Bi-Directional Path Tracing”。第一次给出完整算法 + 实验对照。
- 1995:Veach(Stanford)独立发表了类似工作,但加入更系统的路径空间积分框架。
- 1997:Veach 博士论文成型,BDPT + MIS + MLT 一套打包,成为之后 20 年所有学术教材引用的版本。1993 的 Lafortune 论文反而被埋没。
- 2012:Georgiev 等人提出 VCM(Vertex Connection and Merging),把 BDPT 和光子映射统一在一个 MIS 框架下。
- 2015 后:神经网络辅助的路径引导(neural path guiding)开始替代部分 BDPT 角色,但 BDPT 思想仍是底座。
公平说一句:算法雏形是 1993 Lafortune-Willems,工程实用版是 1997 Veach。Lafortune 后来在材料模型领域更出名(“Lafortune lobes”,1997)—— 一个研究员两次拿到方向性贡献,足够幸运。
学到什么
- 变量替换思路:原积分难采样,找一个等价的变量替换让采样概率分布更接近被积函数 —— 双向就是”把一次蒙特卡洛拆成两次再相乘”
- 重要性采样的极致:BDPT 本质是为同一个积分准备多个估计器,每个估计器在不同区域擅长 —— 后来 MIS 把”如何合并多个估计器”变成系统理论
- 早 4 年的论文也会被埋没:好想法 + 不够漂亮的数学框架 = 教科书写另一个人的名字。Veach 1997 之所以被记住,因为他用路径空间积分把 BDPT / MLT / 光子映射统一成一个数学对象
- 离线渲染 30 年的核心节奏:方差消减(variance reduction)—— 不是让每个采样更准,而是让采样落在重要的地方
- 算法和框架不一样:1993 给的是算法(怎么算),1997 给的是框架(为什么对、怎么扩展)。搞研究偏框架,搞工程其实更需要算法 —— 两者都看才完整
延伸阅读
- 论文 PDF:Lafortune-Willems 1993 Bi-Directional Path Tracing(鲁汶大学官方扫描版,14 页)
- 工业实现解读:PBRT 第 16 章 — Bidirectional Path Tracing
- Veach 博士论文:Robust Monte Carlo Methods for Light Transport Simulation, Stanford 1997(完整 BDPT + MIS + MLT,450 页)
- kajiya-1986-rendering-equation —— BDPT 是它的方差消减版
- cook-1984-distributed-ray-tracing —— 把”模糊”统一成采样的更早一步
关联
- kajiya-1986-rendering-equation —— 提供被求解的积分方程,BDPT 是它的高效估计器
- cook-1984-distributed-ray-tracing —— 蒙特卡洛在渲染里的源头
- whitted-1980 —— 第一代递归光线追踪,无法处理 BDPT 解决的间接光
- disney-brdf-2012 —— BDPT 在每个顶点要采样的 BRDF,Disney 模型是工业标配
反向链接
- bentley-1975-kdtree —— k-d 树 — 多维空间里的二叉搜索树
- burgess-2020-turing-rt —— Burgess 2020 RTX ON — Turing 把光线追踪做进硅片
- cook-1984-distributed-ray-tracing —— Distributed Ray Tracing — 把所有”模糊”效果统一成随机采样
- disney-brdf-2012 —— Disney Principled BRDF 2012 — 11 个滑块封装 Cook-Torrance 全家桶
- goral-1984-radiosity —— Goral 1984 Radiosity — 把建筑工程的辐射热传导算法搬进图形学
- kajiya-1986-rendering-equation —— Kajiya 渲染方程 — 把所有渲染算法统一成一个积分方程
- veach-1995-mis —— Veach MIS — 用一行加权公式让多种采样策略各取所长
- veach-1997-mlt —— Veach MLT — 用 Metropolis 在路径空间游走,专攻 BDPT 也算不动的难场景
- whitted-1980 —— Whitted 1980 — 让光线在场景里递归跑三种次级射线