对于反射方程, 是一个“空间-方向”相关的入射辐射度,ppg算法在于学习入射光辐射的近似
,并根据此对方向
进行采样。然后因为没有对bsdf进行采样,后面可以对bsdf进行MIS。
ppg核心是一个迭代的学习机制:
- 渲染过程划分成M个pass,称作“iteration”,
- 每次都生成一个全新的,更强大的入射辐射近似
.
-
的生成基于
的引导。
这种机制不仅在渲染早期有效,也避免了耗时的预计算
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估计。
3.1 收集L的估计
当一个完成的路径组成之后,遍历路径的所有顶点,分发所有顶点的MC入射光辐射估计至.
对于顶点v,及其入射估计, 首先进行一次空间位置查找,即在二叉树中向下查找,找到包含
的叶子节点。这个叶子节点存储了一个quad-tree的引用。quad-tree有两个维度的参数,刻画了整个球面的方向;使用世界空间的柱坐标去保存面积比例(area ratios),当从primary到directional域进行转换时。在quad-tree中按照方向域去遍历,只进入包含了
的节点,并在下降遍历的过程中,在所有经过的节点中,保存
。
当当前迭代中,所有的辐射估计都已经被保存时,quad-tree的节点估计了所有节点quad对应的通过球面区域的总入射辐射。在二叉树叶子节点及其对应的quad-tree中采样的所有空间位置中,他们的方向分布被averaged了。更多的,为了引导下一次迭代的路径构建,这个信息也用于适配SD-tree的结构,以用于后面的估计的收集(在后面章节中介绍)
3.2 适应性的空间二叉树
二叉树的深度和结构,决定了辐射场空间近似的完善程度和适应性。
为了让refinement更加直观,我们交替使用x,y,z轴,永远划分在中间的节点。是否划分节点由如下策略驱动:上一次迭代中,节点volume中记录的,路径顶点的个数。对于每个叶子节点,在path tracing的过程中,都有一个计数器。特别的,当一个节点至少有个路径顶点的时候,去划分一个节点,其中
与第
次迭代追踪的路径数量成正比(section 3.4),
来自于quad-tree的分辨率,section 5.3中有详细细节。细分之后,每一个叶子节点大致包含了
个路径顶点。因此,所有叶子节点的总数,正比与
。这个阈值保证了叶子的总数,以及,在迭代过程中,每个叶子节点的采样数以
增长。常数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的
,就划分节点。划分节点是,我们分配一个四分之一的flux到新创建的孩子节点,然后递归的应用这个细分策略。同时,在每一个存在的内部节点中估计细分策略 - 裁剪他的孩子节点如果策略不满足。这样,那些具有高入射flux的球面区域就可以有更高的分辨率。这种细分策略生成一个大致上等能量划分的方向域。
在每次迭代之后重构quad-tree保证数据结构适应新收集到的数据,其次内存的使用也比较有效。阈值控制使用了多少内存,quad-tree节点的个数正比与
. 5.2节有详细分析。
3.4 无偏的迭代式学习和渲染
为了加速学习,使用了类似Vorba的迭代机制:训练一个序列, 其中
仅仅使用BSDF采样去估计,对于所有
则联合
以及BSDF,通过MIS去估计。从
中采样去估计
通常击打的加速了收敛。
对于给定路径顶点,使用
采样的方法如下。首先,在二叉树中向下寻找,去找到包含顶点位置
的叶子节点。接着,从空间叶子节点的quad-tree中采样一个
,采样方法是启发式采样warping。
指数级采样计数
如果在每次迭代中,使用相同的路径采样个数,那么仅有一小部分样本能够对图像直接产生贡献,因为前面大部分的样本仅仅用于学习入射辐射场。如果学习到的分布与公式2中分子成比例,那么这不会是个问题,在这种情况,一个单个样本理论上就可以找到分子与pdf的scale因子。然而,我们的分布,只对入射辐射进行了近似,仍然需要在半球空间进行乘积计算(Lfcos)。因此,提出在每次迭代中以几何级数的增加路径采样样本个数,即:对于第k次迭代,我们使用两倍于k-1次迭代的样本数。因此,学习比学习
大概需要两倍的时间,但是只有一半的方差。在实际应用中,由于迭代式的重要性采样机制的积极效果,方差的减少通常更高。然而,在最坏的情形(迭代式学习无法加快收敛),仅有一半的样本被浪费。
在每次迭代中,增倍样本个数的另一个重要的特性是当考虑我们的空间细分机制。因为二叉树叶子节点的空间细分将其空间一分为二,加倍样本数保证了几乎一样的样本数给到新的叶子节点中。因此,即使在局部,比
噪声更少。
在线渲染预览
为了给用户快速的视觉反馈,我们使用当前迭代中的路径样本给出的渐进式显示渲染的图片。只要我们不在迭代之间混淆路径样本,图像就是无偏的,因为在一次迭代过程中,所有的路径样本都是相互独立的。
因为在每次迭代过程中,都是从头开始渲染,即下一次循环开始的时候,图像会突然有质量的下降。为了避免这种现象,当且仅当他聚集了比上次循环还多的样本之后,再切换到当前迭代的图像。
3.5 平衡学习和渲染
这里讨论给定计算预算B,如何划分学习和渲染,使得最终图像方差最小。预算B可以定义为时间,或者样本数。
对于第k次迭代,我们定义“单位房差预算(budget to unit variance)”,换句话说,第k次迭代路径追踪的图像
的方差
和用于构建这些路径的预算
.方差
根据
像素平均方差计算得来,假定使用
来引导路径,直到达到预算B,那么最终图像的方差
:
。其中
是从第k次迭代开始时,剩下的预算,即
.
这里的目标是找到最优的迭代,是的最终图像方差最小,即
。为了达到这个目的,假设训练是单调递减的回馈;更准确的,序列
是单调递减以及凸,然后
也是凸的。然后可以找到一个最小的k,使得
成立。如果我们需要估计
,我们需要多进行一次迭代,但是这浪费掉的计算大大超过我们自动预算机制带来的方差的减少。
当给定一个目标方差的时候,我们可以使用一个类似的方法去最优地平衡训练和渲染。在这种情况,我们可以估计需要的渲染预算,通过
,以达到目标方差的
。当总预算,
时,训练停止,其中
。这样,可能成功的找到
,因为当
增加的时候,是凸函数。
网友评论