美文网首页
practical path guiding

practical path guiding

作者: wangchi | 来源:发表于2022-06-12 17:04 被阅读0次

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

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

  • 渲染过程划分成M个pass,称作“iteration”,
  • 每次都生成一个全新的,更强大的入射辐射近似\hat{L}^k_i.
  • \hat{L}^k_i的生成基于\hat{L}^{k-1}_i的引导。
    这种机制不仅在渲染早期有效,也避免了耗时的预计算

Spatial-Directional Tree SD树

  • 上部是一个划分空间域的二叉树,
  • 下部是一个四叉树,划分方向域。

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

每次迭代产生一张图像I^k以及SD-tree \hat{L}^k_i。早期的图片噪点很大,如果将每次迭代的平均起来噪声更大,因此,不如丢弃早期的图片。因此ppg的迭代机制:后一次迭代的sample数是前一次的两倍。1+2+4+...+ 2^{M-1} = 2^M -1, 这是基本最后一次采样数的两倍。仅仅保留最后一次迭代的图像。

第三节

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

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

3.1 收集L的估计

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

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

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

3.2 适应性的空间二叉树

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

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

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

3.3 适应性的directional quad-tree

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

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

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

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

3.4 无偏的迭代式学习和渲染

为了加速学习,使用了类似Vorba的迭代机制:训练一个序列\hat{L}^1, \hat{L}^2,\hat{L}^3 .... \hat{L}^M, 其中\hat{L}^1仅仅使用BSDF采样去估计,对于所有k>1, \hat{L}^k则联合\hat{L}^{k-1}以及BSDF,通过MIS去估计。从\hat{L}^{k-1}中采样去估计\hat{L}^{k}通常击打的加速了收敛。

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

指数级采样计数

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

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

在线渲染预览

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

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

3.5 平衡学习和渲染

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

对于第k次迭代,我们定义“单位房差预算(budget to unit variance)\tau_k = V_kB_k”,换句话说,第k次迭代路径追踪的图像I_k的方差V_k和用于构建这些路径的预算 B_k.方差V_k根据I_k像素平均方差计算得来,假定使用\hat{L}^{k}来引导路径,直到达到预算B,那么最终图像的方差V_k\hat{V}_k = \frac{\tau_k}{\hat{B}_k}。其中{\hat{B}_k}是从第k次迭代开始时,剩下的预算,即\hat{B}_k = B - \sum_{i=1}^{k-1}B_i.

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

当给定一个目标方差的时候,我们可以使用一个类似的方法去最优地平衡训练和渲染。在这种情况,我们可以估计需要的渲染预算\bar{B} _k,通过\bar{B}_k = \tau_k/\bar{V},以达到目标方差的\bar{V}。当总预算,\tilde{B}_k>\tilde{B}_{k+1}时,训练停止,其中\tilde{B}_k = \tilde{B}_k + \sum_{i=1}^{k-1}B_i。这样,可能成功的找到\hat{k} = arg min_k \hat{B}_k,因为当\tilde{B}_k增加的时候,是凸函数。

相关文章

网友评论

      本文标题:practical path guiding

      本文链接:https://www.haomeiwen.com/subject/udetzctx.html