第二篇论文研读文章了,虽然依旧很菜,但这一篇开始就相对轻松一点了。文档种有些问题,其中所有“实时”应该替换为“高效”。
Hierarchical Russian Roulette for Vertex Connections
主要目标
为了解决双向路径跟踪算法在specular-diffuse-glossy或glossy-diffuse-glossy情况下反射计算低效且质量差的问题,提出了一个分层的俄罗斯轮盘赌技术来进行顶点连接。该技术利用在眼睛子路径(或相机子路径)顶点处的近似散射波瓣来与VPL进行连接,不在波瓣中的VPL便可以直接剔除。由于使用了俄罗斯轮盘赌技术,便可以不需要使用太多的采样点就可提升绘制的质量。
算法细节
符号表格
Symbol | Domain | Description |
---|---|---|
y y y | R 3 R^3 R3 | 光子路径中的顶点 |
z z z | R 3 R^3 R3 | 眼睛子路径中的顶点 |
P ( y , z ) P(y,z) P(y,z) | [ 0 , 1 ] [0,1] [0,1] | 俄罗斯轮盘的概率 |
n n n | S 2 S^2 S2 | 表面法线 |
ω \omega ω | S 2 S^2 S2 | 散射波瓣上的一个方向 |
ω ′ \omega^{\prime} ω′ | S 2 S^2 S2 | 入射方向 |
ρ ( z , ω ′ , ω ) \rho(z,\omega^{\prime},\omega) ρ(z,ω′,ω) | [ 0 , ∞ ] [0, \infin] [0,∞] | z z z处的BRDF |
q z ( ω ) q_z(\omega) qz(ω) | [ 0 , ∞ ] [0, \infin] [0,∞] | z z z处的近似散射波瓣 |
ξ i \xi_i ξi | [ 0 , 1 ) [0,1) [0,1) | 第 i i i个均匀随机数 |
R ( ω ; z , ξ i ) R(\omega;z,\xi_i) R(ω;z,ξi) | [ 0 , ∞ ] [0, \infin] [0,∞] | z z z处的随机散射范围 |
D ( ⋅ ) D(\cdot) D(⋅) | [ 0 , ∞ ] [0, \infin] [0,∞] | GGX分布 |
K ( ⋅ ) K(\cdot) K(⋅) | [ 0 , 1 ] [0, 1] [0,1] | 平方椭球波瓣(SEL)函数 |
α x , α y \alpha_x,\alpha_y αx,αy | [ 0 , 1 ] [0, 1] [0,1] | GGX的粗糙度 |
α ˙ x , α ˙ y \dot\alpha_x, \dot\alpha_y α˙x,α˙y | [ 0 , 1 ] [0, 1] [0,1] | SEL的粗糙度 |
M M M | N N N | 光子路径的数量 |
分层的俄罗斯轮盘赌
在这个方法中,对于所有缓存的光顶点,都会执行一次俄罗斯轮盘赌,并且会将眼睛顶点处的BRDF考虑在内。俄罗斯轮盘赌通过基于范围的剔除来加速,因此就可以从大量的光顶点中高效地采样出一些光顶点。现有的光剔除方法都使用光顶点的范围,而我们使用眼睛顶点的范围来对眼睛子路径跟踪中的每个顶点进行光顶点剔除。本节介绍一种高效的分层的俄罗斯轮盘赌算法。
随机散射范围
对于光顶点 y y y和眼睛顶点 z z z的连接,我们使用下面的俄罗斯轮盘赌的接受概率: P ( y , z ) = min ( C q z ( z y → ) ∥ y − z ∥ 2 , 1 ) P(\mathrm{y}, \mathrm{z})=\min \left(\frac{C q_{\mathrm{z}}(\overrightarrow{\mathrm{zy}})}{\|\mathrm{y}-\mathrm{z}\|^{2}}, 1\right) P(y,z)=min(∥y−z∥2Cqz(zy),1)其中, C ∈ [ 0 , ∞ ) C \in [0, \infin) C∈[0,∞)是一个用户指定的参数,可用来控制方差和性能之间的权衡。球函数 q z ( ⋅ ) q_z(\cdot) qz(⋅)约等于散射波瓣: q z ( ω ) ≈ ρ ( z , ω ′ , ω ) ∣ ω ⋅ n ∣ q_{\mathrm{z}}(\omega) \approx \rho\left(\mathrm{z}, \omega^{\prime}, \omega\right)|\omega \cdot \mathrm{n}| qz(ω)≈ρ(z,ω′,ω)∣ω⋅n∣
公式中出现的符号可以在表格中查询。为了对所有缓存了的光顶点进行俄罗斯轮盘的加速操作,就需要通过眼睛顶点在世界空间中的接受范围来剔除那些不重要(被拒绝)的光顶点。使 ξ i \xi_i ξi表示第 i i i个均匀随机数,那么眼睛顶点 z z z处在世界空间中的范围的界限就是一个椭球函数,并且给定距离 ∥ y − z ∥ \|y-z\| ∥y−z∥满足 P ( y , z ) = ξ i P(y,z)=\xi_i P(y,z)=ξi,其定义如下: R ( ω ; z , ξ i ) = C q z ( ω ) ξ i R\left(\omega ; \mathbf{z}, \xi_{i}\right)=\sqrt{\frac{C q_{\mathbf{z}}(\omega)}{\xi_{i}}} R(ω;z,ξi)=ξiCqz(ω)因此,只有在 R ( ω ; z , ξ i ) R(\omega;z,\xi_i) R(ω;z,ξi)范围内的光顶点才会进行顶点连接的操作。
分层拒绝
使用BVH剔除
为了快速地在散射范围 R ( ω ; z , ξ i ) R(\omega;z,\xi_i) R(ω;z,ξi)中寻找光顶点,我们构建了一个光顶点的二分层级包围体(BVH)。使用这个BVH,散射范围和光顶点的包围盒之间的相交测试就可以使用一种自上而下的分层方式进行。然而,尽管散射范围的形状只依赖于近似波瓣 q z ( ω ) q_z(\omega) qz(ω),但范围的大小却依赖于随机变量 C / ξ i \sqrt{C/\xi_i} C/ξi并且对于不同的光顶点(即叶子节点)来说都是不同的。因此,为了适当地对每一个BVH节点执行相交测试,对于内部节点都使用最大的大小,如图3所示。
这个大小为 C / m i n i ∈ L ξ i \sqrt{C/min_{i \in L}\xi_i} C/mini∈Lξi,其中 L L L表示该节点包含的叶子节点的索引集。每一个节点都需要能够高效地获得这个最小的随机数 m i n i ∈ L ξ i min_{i \in L}\xi_i mini∈Lξi。
预生成随机数的问题
一种低效的获取每一个节点中最小的随机数的方法就是以自下而上的方式进行预计算。首先,在预处理步骤中将单个随机数分配给每个光顶点,其方法类似于随机光剔除方法。然后,在构建BVH的阶段,将最小随机数从叶子节点传播到更上层的节点。然而,因为对于所有的眼睛顶点都是使用相同的预计算的随机数,这种方法就会在眼睛顶点间产生相关性方差。如果眼睛顶点被密集采样(例如超采样)的话,这种相关性方差会影响计算效率,并且在后处理去噪过程中(例如图片去噪)也会极大地降低效率。为了避免相关性方差,就必须为每一对光顶点和眼睛顶点赋予不同的随机数。但是,在每一个眼睛顶点处都进行一次完全自下而上传播的代价明显是非常昂贵的。所以我们提出了一个实时生成最小随机数的方法,该方法是自上而下的方式并且不会对所有光顶点生成随机数,自然也就不需要自下而上地传播随机数了。
实时生成最小的随机数
我们首先讨论一种时间复杂度为O(1)的方法来在均匀随机数之间生成最小值。然后,我们扩展这个方法为一种自上而下的分层算法,并以此来在每一个BVH节点中生成最小的随机数。为了提升这个算法的数值稳定性,我们采用一种半分层的采样方法,并使用重叠层来生成均匀且部分分层的随机数。
最小随机数的PDF
N N N个随机数 { ξ 1 , . . . , ξ N } \{\xi_1,...,\xi_N\} { ξ1,...,ξN}中的最小值可以通过考虑其PDF来生成[问题2]。这个PDF可以通过分析的方法来获得,如下: p min