Skip to main content

Chapter 41: Bidirectional Techniques

双向技术讨论的是同一件事:当一条有效光路很难从相机端随机走到光源端时,渲染器怎样同时利用相机采样和光源采样来提高样本效率。本章以一个室内场景作为贯穿材料:小面积光源照亮天花板的一小块区域,房间主体依赖间接光,桌面上还有一只玻璃杯产生焦散。普通 Path Tracing 从相机出发时,大量路径在找到有效亮区前已经终止;从光源出发时,很多能量又难以落入当前像素。Bidirectional Techniques 的目标是把这两类路径放到同一套 path-space estimator 中比较、连接和加权。

读完本章后,读者应能追踪一条 BDPT(Bidirectional Path Tracing)样本从像素采样、camera subpath、light subpath、vertex connection、visibility test、MIS weight 到 film accumulation 的完整路径;能判断噪声来自路径采样缺失、测度转换错误、可见性连接失败,还是权重计算不稳定;也能比较 Path Tracing、Light Tracing、Photon Mapping 与缓存结构在小光源、焦散、室内间接光和 glossy path 场景中的适用边界。

本章的标准技术背景来自 Eric Veach 的 1997 年博士论文 Robust Monte Carlo Methods for Light Transport Simulation,以及 PBRT v3 的 Bidirectional Path Tracing 实现说明。正文会把这些材料整理成工程判断:一个 renderer 中需要保存哪些 path vertex 数据,哪些 PDF 必须统一到同一测度,哪些连接策略需要特殊处理,哪些调试视图可以解释最终画面噪声。

41.1 双向路径追踪的基本思想

双向路径追踪的核心对象是一条完整光路,而完整光路可以由两段子路径拼接得到。camera subpath 从镜头或传感器采样开始,经由屏幕像素进入场景,在表面或介质中逐次散射;light subpath 从光源采样开始,沿着光传播方向逐次散射。渲染器在两条子路径上选择一对可连接顶点,发出一条 visibility ray,连接通过后把两端 throughput、两个散射函数和几何项相乘,得到一次对像素 radiance 的估计。

在室内贯穿场景中,普通相机路径需要先击中墙面,再刚好散射到天花板亮斑,再从亮斑方向看到小光源,这类随机事件概率很低。光源子路径从小光源出发时,第一批顶点更容易落在天花板亮斑和玻璃杯附近。BDPT 把 camera vertex 与 light vertex 连接,相当于把“从眼睛找亮区”和“从光源找可见区域”放在同一条估计路径中。画面上的变化通常表现为室内暗部间接光更稳定,焦散附近更早出现可见结构,高亮噪点数量下降。

一个 BDPT sample 的主路径可以写成下面的管线。图中只描述单个像素样本;真实实现会在 tile、sample index 和线程任务上并行执行。

图中的 st 是连接策略编号。s 表示使用 light subpath 的前缀顶点数量,t 表示使用 camera subpath 的前缀顶点数量。s = 0 可以表示纯相机路径击中光源,s = 1t > 1 常对应显式 light sampling,t = 1 常对应 light tracing 把贡献 splat 到 film 上。一般连接 s > 1, t > 1 时,渲染器在 light vertex 与 camera vertex 之间做一条阴影可见性测试。

完整路径的贡献可以用工程形式表示为:light_throughput * light_bsdf * geometry_term * camera_bsdf * camera_throughput * MIS_weight。其中 light_throughput 记录从光源端走到连接点的能量权重,camera_throughput 记录从相机端走到连接点的重要性权重,两个 BSDF 或 phase function 评估连接方向是否被材质允许,geometry_term 处理距离平方衰减、表面朝向和遮挡。这个表达式把视觉结果拆回了资源和管线阶段:ray intersection 提供顶点,material system 提供 BSDF,scene acceleration structure 提供 visibility,sampler 提供随机变量,film 接收最终贡献。

BDPT 的工作单位通常是 path vertex。一个 vertex 至少需要保存类型、位置、几何法线或着色法线、throughput、前向 PDF、反向 PDF、delta 标记和可连接标记。类型决定它来自 camera、light、surface 还是 medium;delta 标记决定连接策略能否跨过纯 specular 事件;前向和反向 PDF 决定后续 MIS weight 是否能比较所有可替代策略。缺失这些数据时,算法仍然可能生成画面,但噪声、能量偏差和调试困难会同时出现。

贯穿场景中的玻璃杯说明了可连接性的边界。玻璃表面如果被建模为理想 specular,散射方向由入射方向和折射率唯一决定,渲染器无法用任意两点之间的直线连接来构造合法散射事件。连接策略遇到这类 vertex 时,应把它标成 delta 并跳过直接连接。rough glass 或 glossy material 有有限宽度的散射 lobe,可以评估 BSDF 和 PDF,连接策略才有机会给出有效贡献。这个边界决定了 BDPT 对某些焦散路径有效,对纯 specular chain 仍会保留高方差。

41.2 权重计算与合并策略

BDPT 的权重问题来自同一条完整光路可以由多种策略生成。以“光源 → 天花板亮斑 → 墙面 → 相机”为例,渲染器可以从相机端先走到墙面,再连接天花板亮斑;也可以从光源端先走到亮斑,再连接墙面;还可以让普通 Path Tracing 在某次随机散射中击中光源。每一种构造方式都有自己的采样概率。直接平均会放大低概率高贡献样本,画面表现为 firefly 和局部斑点。MIS(Multiple Importance Sampling,多重重要性采样)负责把这些策略合成一个更稳定的估计。

MIS 的输入是同一条完整路径在不同策略下的 PDF。为了比较这些 PDF,渲染器必须把所有概率密度放到同一测度上。表面散射通常先给出方向空间的 PDF,也就是每单位立体角概率密度;路径连接和 path-space estimator 需要每单位面积概率密度。对从顶点 x 采样到表面顶点 y 的一段连接,常用转换为 p_A(y) = p_omega(w) * abs(dot(n_y, -w)) / distance2(x, y)。介质顶点、无穷远环境光和 camera endpoint 还需要各自的特殊处理,工程实现中通常把转换封装在 vertex 方法里。

几何项和 PDF 转换必须配套理解。连接贡献中的几何项可以写成 G(x, y) = V(x, y) * abs(dot(n_x, w)) * abs(dot(n_y, -w)) / distance2(x, y),其中 V(x, y) 是 visibility 或 transmittance。PDF 转换也含有距离平方和接收端余弦。前者描述这条连接对 radiance 的物理贡献,后者描述这条连接被某个采样策略生成的概率。把二者混在一起会使 MIS weight 失去可比性,常见症状是距离变化时亮度漂移,或斜角表面上噪声权重异常。

权重计算可以采用 balance heuristic 或 power heuristic。balance heuristic 的工程含义是:如果某条路径在当前策略下的 PDF 高,而在其他策略下的 PDF 低,当前策略获得更大权重;如果多种策略都能稳定生成它,权重在策略之间分配。power heuristic 会进一步压低 PDF 较小的策略,常用于降低异常高贡献样本的影响。选择哪一种启发式并非画质开关,而是方差控制策略;核心前提仍然是各策略 PDF 计算正确、测度一致、delta 事件处理一致。

下面的简化伪代码展示权重合并的关键数据流。代码省略了 medium、infinite light、camera splat 和 Russian roulette,只保留策略枚举、连接、PDF 比较和权重累积的骨架。

struct PathVertex {
VertexType type;
float3 position;
float3 normal;
Spectrum beta;
float pdfFwd;
float pdfRev;
bool delta;
bool connectible;
};

for (int t = 1; t <= cameraCount; ++t) {
for (int s = 0; s <= lightCount; ++s) {
int depth = s + t - 2;
if (depth < 0 || depth > maxDepth) {
continue;
}

Connection c = connectPath(lightPath, cameraPath, s, t, scene);
if (!c.valid) {
continue;
}

float w = misWeight(lightPath, cameraPath, s, t, c, scene);
Spectrum contribution = c.throughput * w;
accumulateFilm(contribution, c.filmPosition);
}
}

这段代码要证明的判断是:BDPT 的复杂度主要来自“同一路径的多种生成方式”,连接本身只是其中一个步骤。connectPath 负责判断两端 vertex 是否可连接、计算 BSDF、发出 visibility ray 和得到未加权贡献;misWeight 负责从当前路径反推其他策略生成该路径的概率。工程上应把这两个函数拆开,因为连接错误和权重错误在图像上会混成同一种噪声,拆开后才能通过 debug output 定位。

在贯穿场景中,如果天花板亮斑附近出现孤立高亮点,先查看该样本的 path length、s,t 策略和 MIS weight。若高亮点多来自 s = 0 或显式 light sampling,说明相机路径偶然命中高能区域后权重压制不足;若高亮点来自 general connection,检查连接两端的 PDF 是否都已转换为面积测度;若某些策略图全黑,检查 delta 标记、light endpoint PDF 和 visibility ray 是否提前返回。这个顺序把画面噪声转成可复查的数据路径。

41.3 稳定实现双向追踪

稳定实现 BDPT 的第一步是把 path vertex 设计成调试对象,而非临时交点结构。普通 Path Tracing 可以在每次 bounce 后只保留当前 ray、throughput 和 depth;BDPT 需要在路径生成后回头枚举连接,因此每个 vertex 都要保存后续权重计算所需的信息。最小字段包括 endpoint 类型、interaction 数据、throughput betapdfFwdpdfRev、是否 delta、是否在表面、是否可连接、以及用于输出 film 坐标的 camera sampling 信息。

第二步是让 camera subpath 和 light subpath 使用同一套 random walk 骨架。两者的差异在 transport mode、endpoint 初始化和 PDF 方向上。camera path 携带的是 importance transport,light path 携带的是 radiance transport;散射函数在非对称 BSDF 或 shading normal correction 下会影响反向 PDF。工程实现中,路径生成函数应在每次生成新 vertex 时同时更新当前 vertex 的 forward density,并把 reverse density 回写到前一个 vertex。这样 MISWeight 可以沿着完整路径两侧移动 crossover point,比较所有可行策略。

第三步是把 visibility test 设计成连接阶段的显式资源访问。一次 general connection 要查询场景加速结构,可能还要计算介质 transmittance。它的成本接近一次 shadow ray。由于很多连接在 BSDF 评估后已经为零,稳定实现会先检查两端 connectible,再计算两个散射函数,贡献非零时再发出 visibility ray。这个顺序减少无效 ray query,同时保留正确性。对 alpha-masked geometry、participating media 和 motion blur 场景,visibility tester 还要携带时间、介质状态和透明度处理策略。

第四步是把特殊策略单独写清楚。s = 0 表示 camera path 自己击中 light,需要评估 light emission;s = 1 常可复用 renderer 已有的 direct light sampling;t = 1 表示 light subpath 连接到 camera,样本可能落在另一个 film position,需要 splat;s = 1, t = 1 同时采样 light endpoint 和 camera endpoint,很多实现会跳过这个无效组合。无穷远环境光也需要特殊 endpoint,因为它没有有限面积位置。把这些分支塞进一个通用连接公式会增加错误概率,单独处理更容易复查。

第五步是建立 debug heatmap。BDPT 的最终 RGB 图很难直接说明问题,因为同一个像素内可能混合了多种策略。建议输出至少四类调试通道:策略编号热图、MIS weight 热图、path length 热图、zero reason 热图。策略编号显示哪些 s,t 对画面贡献最大;MIS weight 显示是否存在异常接近一的孤立样本;path length 显示间接光主要来自几次 bounce;zero reason 记录被 delta、BSDF zero、occlusion、PDF zero、depth limit 过滤的连接。可选工具如 RenderDoc 或离线 EXR 查看器只负责观察这些 buffer,正确性仍由路径数据和权重公式决定。

下面的检查顺序适合第一次把 BDPT 接入一个已有 path tracer。它以最小场景开始,逐步打开困难路径,能把错误限定到具体阶段。

  • 用单个 diffuse 面片和一个可见 area light 检查 s = 0、direct lighting 和普通 path tracing 结果是否一致。
  • 用两块 diffuse 墙面检查 general connection 的 geometry term、visibility 和面积 PDF 转换。
  • 用小面积光源照亮天花板亮斑,比较 strategy heatmap 是否显示 light subpath 连接开始承担主要贡献。
  • 加入 rough glass,检查 glossy BSDF 的 forward PDF、reverse PDF 和 connectible 标记。
  • 加入理想 specular glass,检查 delta 连接是否被过滤,剩余贡献是否来自合法策略。
  • 加入 environment light,检查无穷远 endpoint 的 PDF、film splat 和 visible emitter 逻辑。

这组步骤的价值在于每一步只增加一类路径复杂度。若第二步已经失败,后续 glossy、environment 和 medium 调试没有意义;若第四步才失败,问题通常在 BSDF 的双向 PDF 或 delta/lobe 分类;若只有第六步失败,优先检查 endpoint measure 和 film accumulation。

41.4 混合技术与多种方法协同策略

双向技术在工程 renderer 中通常与其他 GI 方法协同使用。标准 Path Tracing 带 next event estimation 对大面积光源、diffuse 场景和直接光很稳定;Light Tracing 更擅长从光源端发现能量集中区域;BDPT 把两端路径通过 MIS 合并,在室内间接光和一部分 glossy path 中减少方差;Photon Mapping 把光源路径存储成 photon map,再通过 density estimation 重建局部辐照度,适合焦散和小光源路径,但结果带有半径和密度估计误差。混合策略要先识别困难光路类型,再选择采样族,而非把所有算法同时打开。

在贯穿场景中,房间暗部间接光主要是小光源通过天花板亮斑进入室内,BDPT 的 light subpath 提供了更容易命中的中间顶点,通常比纯相机路径更快稳定。玻璃杯底部的 sharp caustics 可能包含 specular chain,general connection 无法任意跨越纯 specular 顶点,Photon Mapping 或 Metropolis Light Transport 可能更容易发现这些路径。若焦散被建模为 rough caustics,BDPT 可以通过 glossy lobe 连接得到一部分贡献;若材质接近理想折射,光子密度估计或 path mutation 更有优势。

混合时最容易出错的是把 estimator 和 cache 混为同一层。BDPT 是无偏 Monte Carlo estimator,它对每个像素样本构造路径并计算权重;Photon Mapping 使用 photon storage 和 gather radius,通过一致估计逼近光照;irradiance 或 radiance cache 复用空间和时间邻域样本,通常服务于 diffuse 或低频分量。一个 renderer 可以先用 BDPT 负责困难间接光,再把低频 diffuse GI 缓存到 probe 或 screen-space history 中;但缓存层必须知道输入估计的噪声、偏差和有效空间范围。缓存平滑了错误权重或错误 PDF 后,问题会从随机噪声变成稳定漏光。

可复用的策略选择顺序如下。先看光源是否小、遮挡是否强、间接路径是否经过狭窄区域;这些条件指向 light-side sampling 或 BDPT。再看路径中是否存在理想 specular chain;该条件指向 photon mapping、MLT 或专门的 caustic sampler。接着看材质是否主要 diffuse;该条件适合缓存和低频复用。最后看画面目标是离线质量还是实时近似;离线 renderer 可以承担多策略 MIS 和较深路径,实时 renderer 多依赖低 sample count、temporal accumulation、denoiser 和 guiding。这个顺序先按光路难度分类,再按资源预算收敛。

下面的表把四类方法放在同一组维度上比较。表中“输出证据”指调试时能看到的对象,而非算法宣传语。

方法主要采样方向强项路径主要成本输出证据
Path Tracing + NEE相机端为主,直接采样光源可见光源、diffuse 直接光、大面积光源大量 camera ray 和 shadow rayper-pixel variance、light sample PDF、direct/indirect AOV
Light Tracing光源端为主,贡献 splat 到 film小光源能量分布、部分焦散film splat、camera hit 概率低splat heatmap、light path depth、camera PDF
BDPT相机端与光源端共同构造室内间接光、部分 glossy path、小亮区子路径存储、多连接、MIS PDFstrategy heatmap、MIS weight、zero reason
Photon Mapping光源端存储,视点端 gathercaustics、局部高能量聚集photon storage、半径查询、估计误差photon density、gather radius、caustic map

混合策略还要控制同一贡献被重复统计。若 direct lighting 已经由 Path Tracing + NEE 处理,BDPT 中对应的 direct connection 仍可以参与 MIS,但必须把它作为同一 path estimator 的策略之一。若单独叠加 Photon Mapping 的 caustic pass,需要明确它覆盖的光路集合,例如 specular-diffuse-camera 的 caustic 分量,并在材质或 pass 分类中限制范围。若同时启用 radiance cache 和 BDPT,cache 应记录它缓存的是哪个光照分量、来自哪些 path length、是否包含可见光源贡献。分量边界清楚,最终合成才可复查。

41.5 样本效率与收敛速度

Monte Carlo 渲染的误差随样本数增长通常按平方根速度下降,算法之间真正拉开差距的是方差常数。BDPT 改变的正是样本分布:它让一些原本很难从相机端随机命中的高贡献路径,通过光源端或中间连接被更频繁地生成。它不会改变最终积分目标,也不会让所有困难路径同时消失;它把部分场景中的“极少数超高贡献样本”转成“更多中等贡献样本”,画面上表现为更平滑的间接光和更少的 firefly。

小光源室内场景是 BDPT 的典型优势场景。相机路径从墙面随机散射到小光源方向的概率很低,next event estimation 能直接采样光源,但如果有效照明来自被小光源打亮的二次区域,单次 direct sample 仍难以覆盖。light subpath 把能量先送到亮斑,再与 camera vertex 连接,样本更容易落在有效光路附近。strategy heatmap 中,s > 1, t > 1 的连接会比纯 s = 0 贡献更稳定。

焦散场景需要拆成 rough caustics 和 sharp caustics。rough caustics 的 BSDF lobe 有有限宽度,BDPT 可以评估连接方向的 BSDF 与 PDF,样本效率通常提升。sharp caustics 经过理想镜面或理想折射链,任意连接无法满足 delta 约束,BDPT 的 general connection 会被过滤。此时 Photon Mapping 通过从光源端投射并存储 photon 更容易在 caustic 接收面形成可见结构,MLT 通过 path mutation 更容易沿着已发现的高贡献路径探索邻域。选择算法时要先看材质 lobe 宽度,再看焦散接收面尺寸和光源大小。

室内 diffuse indirect lighting 适合 BDPT 与缓存协同。BDPT 可以用较少样本发现房间内的有效间接路径,缓存或 denoiser 可以复用低频照明分量。这里的关键证据是间接光 AOV 的空间频率:墙面大面积柔和变化适合缓存,接触阴影、玻璃焦散和小亮斑边界需要保留路径级采样或单独 pass。若缓存把高频分量直接平滑,画面会出现漏光、边缘发灰或焦散扩散。

Glossy path 的表现介于 diffuse 与 specular 之间。glossy lobe 越宽,BDPT 连接越容易命中合法方向;lobe 越窄,连接概率和 PDF 计算越敏感。粗糙金属墙面反射小光源时,BDPT 的多连接策略通常能降低噪声;高光很窄的抛光金属或玻璃折射链会保留明显方差。调试时应输出 material roughness、BSDF sampled type 和 strategy weight,观察噪声是否集中在低 roughness 区域。若是,优先改进 BSDF sampling、path guiding 或专门 caustic sampler,而非盲目增加 BDPT 连接数量。

样本效率评估应看同等时间下的误差,而非只看同等 samples per pixel。BDPT 每个像素样本要生成两条子路径并枚举多个连接,单样本成本高于普通 Path Tracing。公平比较需要固定渲染时间或 ray budget,输出 direct、indirect、caustic、glossy AOV 的 variance,再观察哪类分量下降最多。若 BDPT 的每秒样本数大幅下降,而目标场景没有小光源、狭窄亮区或困难间接路径,它可能低于更简单的 Path Tracing + NEE。若目标场景存在强间接小亮区,BDPT 往往用更少有效时间得到更平稳的结果。

最终判断顺序可以压缩为四步:先识别困难光路是否从相机端低概率命中;再检查光源端是否能更容易生成中间顶点;接着确认路径中是否有 delta chain 限制连接;最后用 strategy heatmap、MIS weight 和 AOV variance 验证收益。这个顺序把“使用双向技术”从概念选择变成了可观察的工程决策。

最小自检任务

给定一个离线 renderer 的测试场景:一个小 area light 朝上照亮天花板局部区域,房间内墙面为 diffuse,桌面上放置一个 rough glass 杯子,相机看向墙面和杯底焦散。普通 Path Tracing 在 128 spp 下墙面间接光噪声明显,杯底有少量 firefly。请设计一次 BDPT 调试方案,说明你会记录哪些 path vertex 字段、输出哪些 debug AOV、优先检查哪些连接策略,以及如何判断 BDPT 对这个场景的收益来自室内间接光还是焦散路径。

答案要点

应记录的 path vertex 字段至少包括类型、位置、法线、throughput betapdfFwdpdfRev、delta 标记、connectible 标记、path depth 和对应 s,t 策略。rough glass 需要额外记录 BSDF lobe 类型和 roughness,因为它决定 general connection 是否有合法 PDF。每个成功连接应保存 geometry term、visibility 结果、当前策略 PDF、可替代策略 PDF 和最终 MIS weight。

应输出的 debug AOV 包括 strategy heatmap、MIS weight heatmap、path length heatmap、zero reason heatmap、direct/indirect/caustic 或 glossy 分量图。strategy heatmap 用于观察 s > 1, t > 1 是否在墙面间接光区域贡献增加;MIS weight heatmap 用于发现孤立高权重样本;zero reason heatmap 用于区分连接被遮挡、BSDF 为零、PDF 为零、delta 过滤或 depth limit 过滤。

检查顺序先从 diffuse 墙面开始,确认 general connection 的 geometry term、面积 PDF 转换和 visibility ray 正确;再打开小 area light 和天花板亮斑,观察 light subpath 连接是否降低墙面间接光方差;最后打开 rough glass,检查 glossy BSDF 的 forward/reverse PDF 和 delta 标记。若墙面 indirect AOV 方差下降明显,收益主要来自室内间接光;若杯底焦散区域的 strategy heatmap 显示 rough glass 连接贡献稳定,并且 firefly 减少,收益来自 glossy caustic 分量。若杯底仍由少数高权重样本主导,说明路径接近 sharp caustics,需要考虑 Photon Mapping、MLT 或专门 caustic sampler。

本章知识点总结

  • 双向目标:BDPT 通过相机子路径和光源子路径共同构造完整光路,提高低概率高贡献路径的采样机会。
  • 贯穿对象:室内小光源、天花板亮斑和玻璃杯焦散能同时暴露间接光、glossy path 和 specular chain 的采样差异。
  • 连接策略s,t 描述使用 light subpath 和 camera subpath 的前缀长度,同一完整路径可能由多种策略生成。
  • 路径贡献:一次连接贡献由两端 throughput、两个散射函数、geometry term、visibility 和 MIS weight 共同决定。
  • 顶点数据:稳定实现需要在 path vertex 中保存类型、interaction、throughput、forward PDF、reverse PDF、delta 和 connectible 信息。
  • 测度统一:MIS 权重比较要求所有策略 PDF 使用同一测度,表面方向 PDF 需要转换为面积 PDF。
  • 几何项边界:geometry term 描述路径贡献,PDF 转换描述采样概率,二者混用会导致权重和亮度异常。
  • 特殊策略:光源击中、显式 light sampling、camera splat、无穷远环境光和 delta 事件需要单独处理。
  • 调试证据:strategy heatmap、MIS weight、path length 和 zero reason 能把最终噪声拆回具体连接失败原因。
  • 混合边界:Path Tracing、Light Tracing、BDPT、Photon Mapping 和缓存结构应按光路难度、材质 lobe 和资源预算组合。
  • 焦散判断:rough caustics 更适合 BDPT 连接,sharp caustics 常需要 photon density、path mutation 或专门采样器。
  • 效率评估:BDPT 的收益应按同等时间或 ray budget 下的分量 variance 判断,而非只比较 samples per pixel。