跳转至

ReGIR – An advanced implementation for many-lights offline rendering

原文:ReGIR – An advanced implementation for many-lights offline rendering

1. 背景:Many-Lights 的 NEE 为什么难

  • 朴素 NEE 在成千上万光源(含十万级自发光三角面)中均匀/功率采样,命中“真正照亮当前点”的光概率极低 → 方差大、收敛慢。原文在多场景中展示了 1-SPP 噪声的严重性。

  • 核心问题:让 NEE 的选光分布 更接近真实 integrand,而非仅靠功率或均匀;同时保持可实现、可扩展

2. 基础:RIS 与 NEE 的位置

  • NEE(Next-Event Estimation):在着色点\(P\) 显式采样光与光面点\(x\) ,发阴影射线并估计

\(\hat{L}_d=\frac{f(x)}{p(x)},\quad f(x)=\rho\,L_e\,V\,\cos\theta\;\frac{\cos\theta_L}{d^2}\)

理想分布\(p(x)\propto f(x)\)可趋零方差。

  • RIS(Resampled Importance Sampling):从“易采样”的源分布 生成多候选\(X_1...X_M)\) ,按 目标函数 \(\hat{p}\)重采样为单一输出\(Y\) ,使样本更贴近\(\hat{p}\) 对应的归一化分布 \(\overline{p}\)

3. ReGIR 总览:Reservoir-Grid Importance Resampling

ReGIR 把 RIS 的思想搬到 世界空间网格:先为每个体素格子预置“光样本水库”,渲染时在本地水库上做一次轻量重采样(并发阴影射线),实现 高质量 NEE

3.1 预处理:网格与水库

  • 网格:将场景包围盒划为规则 3D 网格/哈希网格(分辨率后述)。
  • 每格水库:为格子中心代表点(可记录\(P_c,N_c\) )收集若干候选光样本,使用 WRS/RIS 逻辑保留\(R\) 个(例如 64)样本及其统计量。
  • 基础样本来源:可用功率采样、Light Tree,或预计算的 Light Distributions

3.2 着色阶段:二次重采样

  • 在像素着色点\(P\) 定位网格格子 \(c\)

  • 从该格水库中抽取\(S\)个样本,按更接近真实贡献的目标函数再次做 RIS,得到最终光样本;

  • 发阴影射线计算可见性并累积贡献;可与 BSDF 方向样本MIS 融合。

3.3 目标函数(Target Function)设计

为了让 “网格填充” 与 “着色时二次重采样” 都更像真实的\(f(x)\) ,原文建议把几何项与可见性纳入目标函数(若成本允许):

\[ \hat{p}(x)\propto{L_e(x)V(P_{c \leftrightarrow x})\cos\theta\frac{\cos\theta_L}{d^2}} \]

直觉:功率、距离与两侧余弦能把“近、朝向对、亮”的光样本权重拉高;可见性直接剔除被遮挡的候选,显著减噪。

3.4 NEE++ / BSDF Resampling / Reuse / Bias 修正 / MIS / 去相关

  • NEE++:把更多“接近\(f\) ”的因素(可见性、几何)并入采样/重采样阶段。

  • BSDF Resampling:在重采样时把 BSDF 形状纳入\(\hat{p}\) (或与 BSDF-sample 做 MIS)。

  • Spatial/Temporal/Visibility Reuse:邻域/跨帧/可见性结果的复用可降噪,但会引入相关性;离线渲染通常谨慎对待时间复用

  • Fixing the Bias:当使用近似或复用导致偏差时,需配套防御性样本(canonical reservoir)与修正策略。

  • MIS:与 BSDF-sample 合并时用 Balance/Power 权重,确保无偏与稳健性

  • Reducing Correlations:用抖动、蓝噪序列、分层等手段抑制相关性纹理与闪烁。

4. 改善基础样本:Light Distributions 与 Light Tree

  • 为何重要:若基础样本质量差(仅功率/均匀),压力会全部落在二次 RIS 与可见性测试上,方差与相关性尖刺明显。

  • Light Distributions(推荐):为每格子预估各光贡献并保留 Top-N,构造离散分布(Alias/CDF)供 grid-fill 使用;原文报告相对“纯功率”有明显提升。

  • Light Tree / ATS 等层次结构:当构建与目标函数设计得当,质量可与上法相当甚至更优,且避免较大预计算/内存

  • 实务上二者可混合:水库贫瘠或质量不佳时,回退到 Light Tree。

5. 网格尺寸与内存/收益权衡

  • 过粗:水库分布与真实贡献偏差大,着色时难以纠正;

  • 过细:预处理时间/内存猛增,收益递减。

  • 原文在白房间、Bistro 等场景扫描发现:存在一个收益递减区间(例如尺寸从 1 降到 0.5 时收益显著,此后趋缓),需按场景特性实测选取。

6. 总结

朴素采样方法的局限性

理想的采样应该遵循渲染方程中的被积函数 \(f(x)\),它综合考虑了:

  1. BSDF (双向散射分布函数)

  2. 光源发光强度 (\(L_e\))

  3. 可见性 (是否被遮挡, \(V\))

  4. 表面余弦衰减 (\(cos(\theta)\))

  5. 几何项 (距离衰减 \(\frac{1}{d^2}\) 和光源法线)

朴素的采样方法(如均匀采样、按功率采样)之所以失败,是因为它们只考虑了上述 \(f(x)\) 中的零项或一项,导致选中“错误”光源的概率极高,产生大量噪点。

基础技术:RIS (Resampled Importance Sampling)

为了解决上述问题,文章引入了 RIS(重采样重要性采样) 作为基础。

  • 核心思想:RIS 是一种“改进”采样质量的技术。

  • 工作流程

  • 它首先从一个“较差”但“廉价”的分布(如按功率采样)中获取大量(M个)初始样本

  • 然后,它根据一个“目标函数” \(\hat{p}\),从这 M 个样本中“重采样”出 1 个高质量的样本。这个 \(\hat{p}\) 是我们对理想被积函数 \(f(x)\) 的一个“廉价”近似。

  • 这个过程的最终产物是一个“蓄水池”(Reservoir),它存储了:(1) 被选中的那个高质量样本,(2) 该样本的权重,以及 (3) 所有 M 个样本的 \(\hat{p}\)权重总和。

这个“蓄水池”是后续所有算法的核心数据结构。

核心算法:ReGIR (Reservoir-based Grid Importance Resampling)

ReGIR 是本文提出的核心算法。它不是一个单一的技术,而是一系列利用 RIS 蓄水池(Reservoir)来极大提升多光源采样效率的技术合集

1. 核心思想:网格化的蓄水池 (The Grid)

ReGIR 的第一个关键创新是将场景空间划分为一个3D网格

  • 做法:在预处理阶段,首先从场景中所有光源投射光子,并将它们存储在 3D 网格的单元(Cell)中。

  • 然后:对于每个网格单元,运行 RIS 算法,从该单元内的光子中采样,为每个单元生成一个高质量的蓄水池(Reservoir)

  • 结果:我们得到了一个“光照网格”,其中每个单元都存储了一个(或多个)代表该区域“最重要”光源的蓄水池。

在渲染时,着色点 \(P\) 只需要从其所在的网格单元中获取这个预计算好的蓄水池,并直接使用它(而不是在着色时才运行昂贵的 RIS),从而极大加速了采样。

2. 改进目标函数 (\(\hat{p}\)) 和 NEE++

为了让 RIS 选出真正“好”的样本,目标函数 \(\hat{p}\) 至关重要。

  • 廉价的\(\hat{p}\)\(\hat{p}\)不能包含昂贵的可见性(V)测试。文章使用了一个简化的、不含可见性的 \(f(x)\) 版本作为 \(\hat{p}\)

  • NEE++:这是一种补偿策略。既然 \(\hat{p}\)没有考虑可见性,那么在对蓄水池进行重采样时,如果发现选中的样本是不可见的,就立即从蓄水池中重新采样一个新样本,直到找到一个可见的为止。这在不增加存储开销的情况下,有效“注入”了可见性信息。

3. BSDF 重采样

上述步骤只考虑了光源和几何,没考虑材质(BSDF)。

  • 做法:在着色点,除了从光照网格获取一个代表“几何与光源”的蓄水池(我们称之为 \(R_{light}\))之外,还额外独立地根据 BSDF 采样 M 个方向,并为它们在“运行时”构建一个新的蓄水池(称之为 \(R_{bsdf}\))。

  • 结合:最后,使用多重重要性采样(MIS)\(R_{light}\)\(R_{bsdf}\) 两个蓄水池安全地结合起来,得到一个同时考虑了光照、几何和材质的最终样本。

4. 时空蓄水池重用 (Spatiotemporal Reuse)

这是 ReGIR 性能提升的最大来源。核心思想:一个像素的蓄水池对于它的(空间上)相邻像素或(时间上)前一帧的同一像素来说,仍然是“足够好”的。

  • 空间重用 (Spatial Reuse):在渲染当前像素时,查看其相邻像素(例如一个 5x5 邻域)已经计算好的蓄水池。通过 RIS 的蓄水池合并算法,将这些邻居的蓄水池“融合”到当前像素的蓄水池中。这极大地增加了蓄水池的有效样本数量(M),使其质量剧增,显著减少噪点。

  • 时间重用 (Temporal Reuse):与 TAA 类似,将前一帧的蓄水池“投影”到当前帧,并将其与当前帧的蓄水池合并。这进一步提高了样本质量,使得图像收敛速度极大加快。

5. 解决重用带来的问题

时空重用虽然强大,但也带来了两个主要问题:

  1. 可见性复用 (Visibility Reuse) 与偏差

  2. 问题:当重用邻居的蓄水池时,我们也重用了它的可见性信息。如果一个邻居因为被遮挡而选择了光源 A,而当前像素并未被遮挡,这种“有偏”的重用会导致光照“泄露”或“丢失”。

  3. ReGIR 的解决方案:在合并邻居的蓄水池时,重新评估其可见性。如果邻居的样本在当前像素上是不可见的,就重用它,而是触发 NEE++ 重新采样。这修正了偏差(Bias),是 ReGIR 鲁棒性的关键。

  4. 相关性 (Correlations)

  5. 问题:过度重用(例如在时间上重用 95%)会导致蓄水池“停滞”,样本不再变化,导致图像中出现“Wagon-wheel”(车轮)效应或“拖影”类的伪影。

  6. ReGIR 的解决方案:通过随机化来打破相关性。例如,空间重用时,不总是从固定的 5x5 邻域采样,而是随机旋转采样邻域

6. 对 GI 质量的影响

ReGIR 不仅用于直接光照,它同样可以(并且在文章中被)用于间接光照(Global Illumination, GI)。当路径追踪的第二跳(或更多跳)需要采样一个光源时,ReGIR 提供的“高质量光源样本”同样能显著降低 GI 的噪点。