practical path guiding

如题所述

第1个回答  2022-06-05

对于反射方程, 是一个“空间-方向”相关的入射辐射度,ppg算法在于学习入射光辐射的近似 ,并根据此对方向 进行采样。然后因为没有对bsdf进行采样,后面可以对bsdf进行MIS。

ppg核心是一个迭代的学习机制:

Spatial-Directional Tree SD树

记录radiance:
当路径计算完成的时候,记录路径上的每一个点v上的radiance,在sd tree的叶子上t向。在分到树上的时候,需要用最近邻的filter。

每次迭代产生一张图像 以及SD-tree 。早期的图片噪点很大,如果将每次迭代的平均起来噪声更大,因此,不如丢弃早期的图片。因此ppg的迭代机制:后一次迭代的sample数是前一次的两倍。 , 这是基本最后一次采样数的两倍。仅仅保留最后一次迭代的图像。

ppg使用强化学习去构建一个入射光场的 的近似表达。 由一个SD-tree来描述,然后用几何级增长的计算代价逐渐迭代提高;每次迭代均使用两倍sample。

总是维护两个SD-tree,一个用来引导light path的构建,一个用来收集入射辐射的MC估计:
在第k次迭代中,基于上一次的 进行重要性采样,然后将 分发到 。当第k次迭代结束时,丢弃 ,使用 的信息去准备一棵新的sd-tree 去收集下次迭代中的MC估计。

当一个完成的路径组成之后,遍历路径的所有顶点,分发 所有顶点 的MC入射光辐射估计至 .

对于顶点v,及其入射估计 , 首先进行一次空间位置查找,即在二叉树中向下查找,找到包含 的叶子节点。这个叶子节点存储了一个quad-tree的引用。quad-tree有两个维度的参数,刻画了整个球面的方向;使用世界空间的 柱坐标 去保存面积比例(area ratios),当从primary到directional域进行转换时。在quad-tree中按照方向域去遍历,只进入包含了 的节点,并在下降遍历的过程中,在所有经过的节点中,保存 。

当当前迭代中,所有的辐射估计都已经被保存时,quad-tree的节点估计了所有 节点quad对应的通过球面区域 总入射辐射 。在二叉树叶子节点及其对应的quad-tree中采样的所有空间位置中,他们的方向分布被averaged了。更多的,为了引导下一次迭代的路径构建,这个信息也用于适配SD-tree的结构,以用于后面的估计的收集(在后面章节中介绍)

二叉树的深度和结构,决定了辐射场空间近似的完善程度和适应性。

为了让refinement更加直观,我们交替使用x,y,z轴,永远划分在中间的节点。 是否划分节点 由如下策略驱动:上一次迭代中,节点volume中记录的,路径顶点的个数。对于每个叶子节点,在path tracing的过程中,都有一个计数器。特别的,当一个节点至少有 个路径顶点的时候,去划分一个节点,其中 与第 次迭代追踪的路径数量成正比(section 3.4), 来自于quad-tree的分辨率,section 5.3中有详细细节。细分之后,每一个叶子节点大致包含了 个路径顶点。因此,所有叶子节点的总数,正比与 。这个阈值保证了叶子的总数,以及,在迭代过程中,每个叶子节点的采样数以 增长。常数c用空间二叉树分辨率换取了方向quad-tree的收敛。

如果仅根据采样数的方法,来优化tree,似乎很原始,他的性能还是不错的,因为迭代式学习的分布,引导路径至对图像有高贡献的区域;相对于低贡献的区域,这些区域会进一步的得到优化。用一个更粗糙的辐射函数近似区域,这些区中有更少的路径是可以的,因为相对噪声的增加通常被这些路径更小的贡献所抵消了。

除了划分空间二叉树,在每一次迭代结束的时候,也重构quad-tree,用以更好的反映学习到的空间辐射分布;这些新的quad-tree将用于在下次的地带中收集估计。

每一个新的quad-tree的结构,由上次迭代中,收集的空间分布的flux驱动。为了达到这个目的,我们首先拷贝叶子节点旧的quad-tree,或者quad-tree的父节点(如果这个叶子节点是新的 )。

划分拷贝的quad-tree的目的是让每个叶子节点包含不超过原quad-tree1%的flux。具体的,向下遍历旧quad-tree的节点,如果节点的flux大于quad-tree的flux的
,就划分节点。划分节点是,我们分配一个四分之一的flux到新创建的孩子节点,然后递归的应用这个细分策略。同时,在每一个存在的内部节点中估计细分策略 - 裁剪他的孩子节点如果策略不满足。这样,那些具有高入射flux的球面区域就可以有更高的分辨率。这种细分策略生成一个大致上等能量划分的方向域。

在每次迭代之后重构quad-tree保证数据结构适应新收集到的数据,其次内存的使用也比较有效。阈值 控制使用了多少内存,quad-tree节点的个数正比与 . 5.2节有详细分析。

为了加速学习,使用了类似Vorba的迭代机制:训练一个序列 , 其中 仅仅使用BSDF采样去估计,对于所有 则联合 以及BSDF,通过MIS去估计。从 中采样去估计 通常击打的加速了收敛。

对于给定路径顶点 ,使用 采样的方法如下。首先,在二叉树中向下寻找,去找到包含顶点位置 的叶子节点。接着,从空间叶子节点的quad-tree中采样一个 ,采样方法是启发式采样warping。

如果在每次迭代中,使用相同的路径采样个数,那么仅有一小部分样本能够对图像直接产生贡献,因为前面大部分的样本仅仅用于学习入射辐射场。如果学习到的分布与公式2中分子成比例,那么这不会是个问题,在这种情况,一个单个样本理论上就可以找到分子与pdf的scale因子。然而,我们的分布,只对入射辐射进行了近似,仍然需要在半球空间进行乘积计算(L f cos)。因此,提出在每次迭代中以几何级数的增加路径采样样本个数,即:对于第k次迭代,我们使用两倍于k-1次迭代的样本数。因此,学习 比学习 大概需要两倍的时间,但是只有一半的方差。在实际应用中,由于迭代式的重要性采样机制的积极效果,方差的减少通常更高。然而,在最坏的情形(迭代式学习无法加快收敛),仅有一半的样本被浪费。

在每次迭代中,增倍样本个数的另一个重要的特性是当考虑我们的空间细分机制。因为二叉树叶子节点的空间细分将其空间一分为二,加倍样本数保证了几乎一样的样本数给到新的叶子节点中。因此,即使在局部, 比 噪声更少。

为了给用户快速的视觉反馈,我们使用当前迭代中的路径样本给出的渐进式显示渲染的图片。只要我们不在迭代之间混淆路径样本,图像就是无偏的,因为在一次迭代过程中,所有的路径样本都是相互独立的。

因为在每次迭代过程中,都是从头开始渲染,即下一次循环开始的时候,图像会突然有质量的下降。为了避免这种现象,当且仅当他聚集了比上次循环还多的样本之后,再切换到当前迭代的图像。

这里讨论给定计算预算B,如何划分学习和渲染,使得最终图像方差最小。预算B可以定义为时间,或者样本数。

对于第k次迭代,我们定义“单位房差预算(budget to unit variance) ”,换句话说,第k次迭代路径追踪的图像 的方差 和用于构建这些路径的预算 .方差 根据 像素平均方差计算得来,假定使用 来引导路径,直到达到预算B,那么最终图像的方差 : 。其中 是从第k次迭代开始时,剩下的预算,即 .

这里的目标是找到最优的迭代 ,是的最终图像方差最小,即 。为了达到这个目的,假设训练是单调递减的回馈;更准确的,序列 是单调递减以及凸,然后 也是凸的。然后可以找到一个最小的k,使得 成立。如果我们需要估计 ,我们需要多进行一次迭代,但是这浪费掉的计算大大超过我们自动预算机制带来的方差的减少。

当给定一个目标方差的时候,我们可以使用一个类似的方法去最优地平衡训练和渲染。在这种情况,我们可以估计需要的渲染预算 ,通过 ,以达到目标方差的 。当总预算, 时,训练停止,其中 。这样,可能成功的找到 ,因为当 增加的时候,是凸函数。