Hierarchical Russian Roulette for Vertex Connections论文研读

2023-05-16

第二篇论文研读文章了,虽然依旧很菜,但这一篇开始就相对轻松一点了。文档种有些问题,其中所有“实时”应该替换为“高效”。

Hierarchical Russian Roulette for Vertex Connections

主要目标

为了解决双向路径跟踪算法在specular-diffuse-glossy或glossy-diffuse-glossy情况下反射计算低效且质量差的问题,提出了一个分层的俄罗斯轮盘赌技术来进行顶点连接。该技术利用在眼睛子路径(或相机子路径)顶点处的近似散射波瓣来与VPL进行连接,不在波瓣中的VPL便可以直接剔除。由于使用了俄罗斯轮盘赌技术,便可以不需要使用太多的采样点就可提升绘制的质量。

算法细节

符号表格

SymbolDomainDescription
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(yz2Cqz(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\| yz满足 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/miniLξi ,其中 L L L表示该节点包含的叶子节点的索引集。每一个节点都需要能够高效地获得这个最小的随机数 m i n i ∈ L ξ i min_{i \in L}\xi_i miniLξi

预生成随机数的问题

一种低效的获取每一个节点中最小的随机数的方法就是以自下而上的方式进行预计算。首先,在预处理步骤中将单个随机数分配给每个光顶点,其方法类似于随机光剔除方法。然后,在构建BVH的阶段,将最小随机数从叶子节点传播到更上层的节点。然而,因为对于所有的眼睛顶点都是使用相同的预计算的随机数,这种方法就会在眼睛顶点间产生相关性方差。如果眼睛顶点被密集采样(例如超采样)的话,这种相关性方差会影响计算效率,并且在后处理去噪过程中(例如图片去噪)也会极大地降低效率。为了避免相关性方差,就必须为每一对光顶点和眼睛顶点赋予不同的随机数。但是,在每一个眼睛顶点处都进行一次完全自下而上传播的代价明显是非常昂贵的。所以我们提出了一个实时生成最小随机数的方法,该方法是自上而下的方式并且不会对所有光顶点生成随机数,自然也就不需要自下而上地传播随机数了。

实时生成最小的随机数

我们首先讨论一种时间复杂度为O(1)的方法来在均匀随机数之间生成最小值。然后,我们扩展这个方法为一种自上而下的分层算法,并以此来在每一个BVH节点中生成最小的随机数。为了提升这个算法的数值稳定性,我们采用一种半分层的采样方法,并使用重叠层来生成均匀且部分分层的随机数。

最小随机数的PDF

N N N个随机数 { ξ 1 , . . . , ξ N } \{\xi_1,...,\xi_N\} {ξ1,...,ξN}中的最小值可以通过考虑其PDF来生成[问题2]。这个PDF可以通过分析的方法来获得,如下: p min ⁡ , N ( u ) = N ( 1 − u ) N − 1 p_{\min , N}(u)=N(1-u)^{N-1} pmin,N(u)=N(1u)N1其中, u ∈ [ 0 , 1 ) u \in [0, 1) u[0,1),推导过程可参考补充材料。这个PDF的累积分布函数的逆函数也有一个封闭形式的解[问题3]。因此,只需要生成一个单一的均匀随机数 ξ ∈ [ 0 , 1 ) \xi \in [0, 1) ξ[0,1)即可随机地生成一个最小随机数,公式如下: min ⁡ { ξ 1 , … , ξ N } = 1 − ( 1 − ξ ) 1 N \min \left\{\xi_{1}, \ldots, \xi_{N}\right\}=1-(1-\xi)^{\frac{1}{N}} min{ξ1,,ξN}=1(1ξ)N1

分层采样

在这里插入图片描述
尽管基于以上公式,我们可以使用一种实时的随机数生成方法,但当 N N N很大时会有精度问题(如图4b所示)。然而,对于1维分层采样的情况(因为是对随机数的边界进行分层,所以这里是1维),我们可以避免数值误差并简化公式。由于分层随机数的最小值总是在最低层内,因此,可以简化为: min ⁡ { ξ 1 , … , ξ N } = ξ N \min \left\{\xi_{1}, \ldots, \xi_{N}\right\}=\frac{\xi}{N} min{ξ1,,ξN}=Nξ如果 u ∈ [ 0 , 1 / N ] u \in [0, 1/N] u[0,1/N],这个情况中的PDF为 p m i n , N ( u ) = N p_{min,N}(u) = N pmin,N(u)=N;否则 p m i n , N ( u ) = 0 p_{min,N}(u) = 0 pmin,N(u)=0。(注:这里最后的结果显然不能无偏差地生成最小值,所以这里很可能是有了这个最后结果,然后作者为了给这个方法合理性而强行构造的理论。原方法可能是随机地生成一个较小的随机数,然后根据这个较小的随机数来划分一个范围,在这个范围就可以随意均匀生成随机数了,这样就可以保证随机数局部均匀并且较小的随机数很容易得到)

分层生成

使用上一个部分中的方法,在自上而下遍历BVH的过程中,我们可以对每一个节点实时生成一个最小的随机数 m i n i ∈ L ξ i min_{i \in L}\xi_i miniLξi。这是自下而上传播的逆过程。对比自下而上的方式,我们这种自上而下的算法不会对剔除了的节点生成随机数,因此在每一个眼睛顶点进行子路径追踪时的执行效率非常高。
在这里插入图片描述
对于我们的BVH来说,父节点的最小随机数一定等于子节点最小随机数中的最小值。因此,在自上而下的分层生成过程中,父节点的最小随机数就会传播给一个子节点(图5中用蓝色节点表示)。然后,对于另一个节点(即图5中的橙色节点),就需要生成一个比其父节点值大的新的最小随机数。继承父节点最小随机数值的子节点是根据子节点中包含的叶子节点数量来随机选择的。这是因为如果所有叶子节点中的随机数是均匀分布的话,那么子树中出现最小值的概率与叶子节点数量成正比。因此,子节点被选中的概率为: P selection  ( j ) = ∣ L j ∣ ∣ L j ∣ + ∣ L j ′ ∣ P_{\text {selection }}(j)=\frac{\left|L_{j}\right|}{\left|L_{j}\right|+\left|L_{j^{\prime}}\right|} Pselection (j)=Lj+LjLj其中, j j j表示节点的索引, L j L_j Lj表示 j j j节点包含的叶子节点的索引集,并且 j ′ j^{\prime} j表示节点 j j j的兄弟节点的索引。对于非分层采样,上面的比父节点值大的新的最小随机数可以用这个公式生成: min ⁡ i ∈ L ξ i = ξ min ⁡ + ( 1 − ξ min ⁡ ) ( 1 − ( 1 − ξ ) 1 / ∣ L ∣ ) \min _{i \in L} \xi_{i}=\xi_{\min }+\left(1-\xi_{\min }\right)\left(1-(1-\xi)^{1 /|L|}\right) miniLξi=ξmin+(1ξmin)(1(1ξ)1/L),其中, ξ m i n ∈ [ 0 , 1 ) \xi_{min} \in [0, 1) ξmin[0,1)是父节点传播给其兄弟节点的最小随机数,并且当该节点为根节点时 ξ m i n = 0 \xi_{min}=0 ξmin=0。然而,这种形式在数值上是不稳定的。为了提高分层采样的数值稳定性,我们只对兄弟节点(新生成随机数的节点)的随机数空间进行分层。尽管这种半分层的方法不能保证其兄弟节点的后代节点也是完全分层的,但它可以在叶子节点中生成均匀的随机数。

半分层算法

在这里插入图片描述
算法1显示了我们使用实时半分层随机赋值进行分层俄罗斯轮盘赌的伪代码。我们的方法首先在根节点处假定1维的分层采样来生成一个最小的随机数。这个最小的随机数是通过生成一个单一的均匀随机数,然后使用上面的公式来生成的: min ⁡ i ∈ L root  ξ i = ξ ∣ L root  ∣ \min _{i \in L_{\text {root }}} \xi_{i}=\frac{\xi}{\left|L_{\text {root }}\right|} iLroot minξi=Lroot ξ其中, L r o o t L_{root} Lroot是根节点包含的所有叶子节点的索引集(即所有缓存的光顶点)。在我们自上而下的算法中,父节点中最小的随机数 ξ m i n \xi_{min} ξmin会被传播给一个子节点,并且会在另一个子节点中生成一个新的最小随机数。对于这些随机数的传播和生成,我们使用了数值上稳定的分层采样方法。为了对两个兄弟节点之间的随机数空间进行分层以获得最小随机数,我们从父节点中传播其分层的上确界 b ∈ [ 0 , 1 ] b \in [0, 1] b[0,1]到子节点中(包括 ξ m i n \xi_{min} ξmin)。然后该子节点的兄弟节点使用一个相邻的分层 [ b , b ′ ) [b, b^{\prime}) [b,b)。这个上确界 b ′ ∈ ( b , 1 ] b^{\prime} \in (b, 1] b(b,1]由分层 [ b , 1 ) [b, 1) [b,1)和其包含的叶子节点数量 ∣ L ∣ |L| L决定,公式如下: b ′ = b + ( 1 − b ) 1 ∣ L ∣ b^{\prime}=b+(1-b) \frac{1}{|L|} b=b+(1b)L1尽管这个分层 [ b , b ′ ] [b, b^{\prime}] [b,b]会和其兄弟节点的后继节点的分层重叠,但其计算非常简单。使用分层 [ b , b ′ ] [b, b^{\prime}] [b,b],新的最小随机数只需要生成一个单一的均匀随机数就可获得,公式如下: min ⁡ i ∈ L ξ i = b + ( 1 − b ) ξ ∣ L ∣ \min _{i \in L} \xi_{i}=b+(1-b) \frac{\xi}{|L|} iLminξi=b+(1b)Lξ上上个公式是上面这个公式的特殊情况,即对于根节点来说 b = 0 b=0 b=0。这个过程在BVH的遍历中会迭代执行。使用这个算法,我们给每一对光顶点和眼睛顶点赋予了不同的随机数,并且不需要在整棵树中执行一次完整的自下而上的遍历。
我们的实时随机数赋值方法将条状走样转换成了高频的噪声。尽管在我们的方法中只是部分分层,但对于性能和数值稳定性来说都是非常有利的。更多的实现细节可以参考补充材料中的c++示例代码。

半分层算法的PDF

我们的半分层算法避免了兄弟节点之间分层的重叠,但它却忽略了兄弟节点的后继节点的完全分层。因此叶子节点的分层会出现重叠的情况。但由于这些重叠的分层的PDF之和总是为1(即均匀分布)[问题4],因此我们的方法是无偏差的。为了在分层 [ b , b ′ ] [b, b^{\prime}] [b,b]之间生成随机数,这个PDF计算如下: P [ b , b ′ ) ( u ) = { 1 b ′ − b  if  u ∈ [ b , b ′ ) 0  otherwise  P_{\left[b, b^{\prime}\right)}(u)=\left\{\begin{array}{ll}\frac{1}{b^{\prime}-b} & \text { if } u \in\left[b, b^{\prime}\right) \\0 & \text { otherwise }\end{array}\right. P[b,b)(u)={bb10 if u[b,b) otherwise 在某个节点处发生生成事件的概率值为从根节点到该节点处的子选择概率的乘积。根据从该节点到后继节点处子选择概率的乘积,这个生成的随机数会被传播给后代节点。设 X X X为从根节点到某节点的节点索引集,这个生成随机数的PDF为: p X ( u ) = p [ b , b ′ ) ( u ) ∏ j ∈ X P selection  ( j ) p_{X}(u)=p_{\left[b, b^{\prime}\right)}(u) \prod_{j \in X} P_{\text {selection }}(j) pX(u)=p[b,b)(u)jXPselection (j)其中,如果 j j j表示根节点,则 P s e l e c t i o n ( j ) = 1 P_{selection}(j) = 1 Pselection(j)=1。当到达叶子节点时, ∏ j ∈ X P selection  ( j ) = 1 / ∣ L root  ∣ \prod_{j \in X} P_{\text {selection }}(j)=1 /\left|L_{\text {root }}\right| jXPselection (j)=1/Lroot ,因此这个PDF变为 p X ( u ) = 1 ( b ′ − b ) ∣ L r o o t ∣ p_{X}(u)=\frac{1}{\left(b^{\prime}-b\right)\left|L_{\mathrm{root}}\right|} pX(u)=(bb)Lroot1,其中 u ∈ [ b , b ′ ) u \in [b, b^{\prime}) u[b,b)。图5显示了我们算法中随机数、分层和PDF的生成和传播过程。如该图所示,叶子节点中重叠区域的PDF之和为1。

对接受概率的近似各向异性反射波瓣

虽然随机散射范围 R ( ω ; z , ξ i ) R(\omega;z,\xi_i) R(ω;z,ξi)的形状由 q z ( ω ) q_z(\omega) qz(ω)所表示的波瓣决定,但理想的形状也应该能简单、高效地进行剔除操作(即在 R ( ω ; z , ξ i ) R(\omega;z,\xi_i) R(ω;z,ξi)和每一个BVH节点间进行相交测试)。尽管一个松弛的包围球可以用来进行保守的相交测试,但其增加了许多误匹配的情况,尤其在各向异性的BRDF中。为了对微平面BRDF的各向异性散射波瓣生成一个更紧密的包围椭球,我们引入了一个平方椭球波瓣(SEL)函数来表示波瓣。对于高效地实现椭球与包围盒的相交测试,可以参考补充材料。

GGX分布

我们的SEL函数是基于GGX分布的: D ( ω ; Q , α x , α y ) = χ + ( v z ) π α x α y ( v x 2 / α x 2 + v y 2 / α y 2 + v z 2 ) 2 D\left(\omega ; \mathrm{Q}, \alpha_{x}, \alpha_{y}\right)=\frac{\chi^{+}\left(v_{z}\right)}{\pi \alpha_{x} \alpha_{y}\left(v_{x}^{2} / \alpha_{x}^{2}+v_{y}^{2} / \alpha_{y}^{2}+v_{z}^{2}\right)^{2}} D(ω;Q,αx,αy)=παxαy(vx2/αx2+vy2/αy2+vz2)2χ+(vz)其中, Q = [ ω x T ω y T ω z T ] T Q=\left[\begin{array}{lll}\omega_{x}^{\mathrm{T}} & \omega_{y}^{\mathrm{T}} & \omega_{z}^{\mathrm{T}}\end{array}\right]^{\mathrm{T}} Q=[ωxTωyTωzT]T是一个由波瓣轴 ω x , ω y \omega_x, \omega_y ωx,ωy ω z \omega_z ωz组成的 3 × 3 3 \times 3 3×3的正交矩阵,并且 [ v x , v y , v z ] T = Q ω T \left[v_{x}, v_{y}, v_{z}\right]^{\mathrm{T}}=\mathrm{Q} \omega^{\mathrm{T}} [vx,vy,vz]T=QωT是变换到波瓣空间的方向。这个正交矩阵 Q Q Q表示波瓣的朝向。 χ + ( v z ) \chi^{+}\left(v_{z}\right) χ+(vz)是海维赛德函数:当 v z > 0 v_z > 0 vz>0时值为1,否则为0。对于各向同性的情况,这个分布可以使用 α = α x = α y \alpha = \alpha_x = \alpha_y α=αx=αy来重写: D ( v z , α ) = α 2 χ + ( v z ) π ( 1 − v z 2 + α 2 v z 2 ) 2 D\left(v_{z}, \alpha\right)=\frac{\alpha^{2} \chi^{+}\left(v_{z}\right)}{\pi\left(1-v_{z}^{2}+\alpha^{2} v_{z}^{2}\right)^{2}} D(vz,α)=π(1vz2+α2vz2)2α2χ+(vz)对于微平面BRDF,GGX分布用于法线分布函数(NDF,即微平面法线的分布),其中参数如下: D ( ω h ; T , α x , α y ) D(\omega_h;T,\alpha_x,\alpha_y) D(ωh;T,αx,αy) ω h = ω + ω ′ ∥ ω + ω ′ ∥ \omega_h = \frac{\omega+\omega^{\prime}}{\|\omega+\omega^{\prime}\|} ωh=ω+ωω+ω表示半程向量,正交投影矩阵 T = [ t x T   t y T   t z T ] T T = [t_x^T \space t_y^T \space t_z^T]^T T=[txT tyT tzT]T由切线 t x t_x tx、副切线 t y t_y ty和平面法线 n n n组成。对于这个情况, [ α x , α y ] [\alpha_x,\alpha_y] [αx,αy]表示平面粗糙度。GGX分布也用于近似散射波瓣(例如基于图片的光照)。在本文中,只有用作为NDF时,GGX分布才被称为GGX NDF。使用GGX近似的散射波瓣被称为GGX散射波瓣。我们使用SEL近似的波瓣是基于GGX散射波瓣的。

平方球波瓣(SSL)

对于微平面BRDF,可用半角近似各项同性GGX分布的散射波瓣: q z ( ω ) ∝ D ( cos ⁡ θ 2 , α ˙ ) q_{\mathrm{z}}(\omega) \propto D\left(\cos \frac{\theta}{2}, \dot{\alpha}\right) qz(ω)D(cos2θ,α˙)其中, θ \theta θ是位于 ω \omega ω和波瓣轴 ω z \omega_z ωz(即散射波瓣的主导方向)之间的夹角,并且 α ˙ \dot\alpha α˙是散射波瓣的粗糙度。这个公式表示的散射范围 R ( ω ; z , ξ i ) ∝ q z ( ω ) R\left(\omega ; \mathbf{z}, \xi_{i}\right) \propto \sqrt{q_{\mathbf{z}}(\omega)} R(ω;z,ξi)qz(ω) 就变成了一个球体。在本文中,上面公式的右边没有标准化因子,所以称为平方球波瓣,可以由下式计算: π α ˙ 2 D ( cos ⁡ θ 2 , α ˙ ) = 4 α ˙ 4 ( 1 − cos ⁡ θ + α ˙ 2 ( 1 + cos ⁡ θ ) ) 2 \pi \dot{\alpha}^{2} D\left(\cos \frac{\theta}{2}, \dot{\alpha}\right)=\frac{4 \dot{\alpha}^{4}}{\left(1-\cos \theta+\dot{\alpha}^{2}(1+\cos \theta)\right)^{2}} πα˙2D(cos2θ,α˙)=(1cosθ+α˙2(1+cosθ))24α˙4

平方椭球波瓣(SEL)

即使NDF是各向同性的,微平面BRDF也会生成各向异性的散射波瓣。因为上式是一个各向同性的球函数,所以它不能表示这种各向异性的散射效果。因此,我们将平方球波瓣推导到了平方椭球波瓣(SEL)。我们在生成SEL时使用了两个粗糙度参数 [ α ˙ x , α ˙ y ] [\dot\alpha_x, \dot\alpha_y] [α˙x,α˙y] K ( ω ; Q , α ˙ x , α ˙ y ) = 4 α ˙ max ⁡ 4 ( U − v z + α ˙ max ⁡ 2 ( U + v z ) ) 2 K\left(\omega ; Q, \dot{\alpha}_{x}, \dot{\alpha}_{y}\right)=\frac{4 \dot{\alpha}_{\max }^{4}}{\left(U-v_{z}+\dot{\alpha}_{\max }^{2}\left(U+v_{z}\right)\right)^{2}} K(ω;Q,α˙x,α˙y)=(Uvz+α˙max2(U+vz))24α˙max4
U = ( α ˙ max ⁡ 2 / α ˙ x 2 ) v x 2 + ( α ˙ max ⁡ 2 / α ˙ y 2 ) v y 2 + v z 2 U=\sqrt{\left(\dot{\alpha}_{\max }^{2} / \dot{\alpha}_{x}^{2}\right) v_{x}^{2}+\left(\dot{\alpha}_{\max }^{2} / \dot{\alpha}_{y}^{2}\right) v_{y}^{2}+v_{z}^{2}} U=(α˙max2/α˙x2)vx2+(α˙max2/α˙y2)vy2+vz2
其中, α ˙ m a x = m a x ( α ˙ x , α ˙ y ) \dot\alpha_{max} = max(\dot\alpha_x, \dot\alpha_y) α˙max=max(α˙x,α˙y)。对于这个公式的推导,可以参考补充材料。这个SEL的平方根是一个简单的椭球,其在波瓣空间中的中心点和半轴分别为 [ 0 , 0 , 1 − α ˙ max ⁡ 2 2 ] \left[0,0, \frac{1-\dot{\alpha}_{\max }^{2}}{2}\right] [0,0,21α˙max2] [ α ˙ x , α ˙ y , 1 + α ˙ max ⁡ 2 2 ] \left[\dot{\alpha}_{x}, \dot{\alpha}_{y}, \frac{1+\dot{\alpha}_{\max }^{2}}{2}\right] [α˙x,α˙y,21+α˙max2]

GGX的近似

尽管GGX是一个半球分布,但SEL是一个椭球函数。然而,对于低粗糙度的情况,可以使用下面的公式来近似: π α x α y D ( ω ; Q , α x , α y ) ≈ K ( ω ; Q , α x 2 , α y 2 ) \pi \alpha_{x} \alpha_{y} D\left(\omega ; \mathrm{Q}, \alpha_{x}, \alpha_{y}\right) \approx K\left(\omega ; \mathrm{Q}, \frac{\alpha_{x}}{2}, \frac{\alpha_{y}}{2}\right) παxαyD(ω;Q,αx,αy)K(ω;Q,2αx,2αy)图6显示了不同粗糙度参数时上式的近似准确率。对于较小的粗糙度值,近似误差可以忽略不计。
在这里插入图片描述

各向异性散射波瓣的近似

对于使用了多重重要性采样(MIS)的双向路径跟踪(BPT),只有在散射波瓣峰值的附近(即BRDF和cos的乘积),PDF的近似准确率才是重要的。因此,我们在近似的峰值方向 ω z \omega_z ωz使用原始的波瓣值来作为SEL的系数: q z ( ω ) = c K ( ω ; Q , α ˙ x , α ˙ y ) q_{\mathrm{z}}(\omega)=c K\left(\omega ; \mathrm{Q}, \dot{\alpha}_{x}, \dot{\alpha}_{y}\right) qz(ω)=cK(ω;Q,α˙x,α˙y)其中, c = ρ ( z , ω ′ , ω z ) ∣ ω z ⋅ n ∣ c=\rho\left(\mathbf{z}, \omega^{\prime}, \omega_{z}\right)\left|\omega_{z} \cdot \mathbf{n}\right| c=ρ(z,ω,ωz)ωzn是系数。对于微平面BRDF来说,因为阴影遮罩函数和菲尼尔系数是低频的,所以峰值方向就可以在光滑平面用完美的镜面反射方向 ω z = 2 ( ω ′ ⋅ n ) n − ω ′ \omega_z = 2(\omega^{\prime} \cdot n)n - \omega^{\prime} ωz=2(ωn)nω来近似。波瓣轴 ω x , ω y \omega_x,\omega_y ωxωy和粗糙度 [ α ˙ x , α ˙ y ] [\dot\alpha_x, \dot\alpha_y] [α˙x,α˙y]可以通过分析球面翘曲[问题1]来获得。尽管球面翘曲是通过各向异性球面高斯推导得出,但其仍然可以应用于GGX分布。因此,本文生成SEL的步骤如下:
(1)如果NDF不是GGX,则将它近似为GGX NDF;
(2)GGX散射波瓣在 ω z \omega_z ωz的中心可以用GGX NDF的球面翘曲来计算;
(3)使用上上式可以将GGX散射波瓣转换为SEL。
可以参考附录A来获取更多关于球面翘曲的细节。

集成进双向路径跟踪

本文通过使用多重重要性采样(MIS)来将我们的基于分层俄罗斯轮盘赌的连接方法和概率连接相结合。这是因为我们的连接方法在镜面-漫反射-光泽(SDG)和光泽-漫反射-光泽(GDG)的路径上非常高效,但概率连接在低频的光照效果处也很高效。概率连接根据概率质量函数(PMF)从缓存中为给定的眼睛顶点采样重要的光顶点,该函数会同时考虑可见性、几何项和光顶点及眼睛顶点处的BRDF。然而,概率连接有重用的光子路径的数量限制(例如100条),因为它的计算代价和内存需求与重用的子路径数量及PMF记录数量成正比。在非常光滑的表面处使用成百上千个采样依然不够充分。尽管我们方法在计算范围时忽略了光顶点的可见性和BRDF,但是重用数百万的光子路径可以减轻概率连接和常规顶点连接的限制。

多重重要性采样

为了使用例如平衡启发等强大的多重重要性采样(MIS)策略,就必须获得采样数和PDF。简单的俄罗斯轮盘为M条光子路径详细地给出了采样密度: d t ( x ‾ ) = M P ( y s − 1 , z t − 1 ) p t ( x ‾ ) d_{t}(\overline{\mathbf{x}})=M P\left(\mathbf{y}_{s-1}, \mathbf{z}_{t-1}\right) p_{t}(\overline{\mathbf{x}}) dt(x)=MP(ys1,zt1)pt(x)其中, x ‾ \overline{x} x是根据光子路径 { y 0 , . . . , y s − 1 } \{y_0, ..., y_{s-1}\} {y0,...,ys1}和眼睛子路径 { z 0 , . . . , z t − 1 } \{z_0, ..., z_{t-1}\} {z0,...,zt1}构建得到的路径,并且 p t ( x ‾ ) p_t(\overline{x}) pt(x)表示眼睛顶点 z t − 1 z_{t-1} zt1处常规顶点连接的PDF。 P ( y s − 1 , z t − 1 ) P(y_{s-1}, z_{t-1}) P(ys1,zt1)表示 y s − 1 y_{s-1} ys1 z t − 1 z_{t-1} zt1之间连接的俄罗斯轮盘赌的接受概率。另一方面,概率连接忽略了PMF,而使用 p t ( x ‾ ) p_t(\overline{x}) pt(x)作为采样密度。这是因为,对于其他技术构建的路径,概率连接无法获得PMF,而考虑到子路径重用导致的路径相关性的最坏情况,样本计数会被修改为1。虽然这种修改对路径相关性来说比较保守,但并没有提高SDG和GDG路径的效率。因为 P ( y s − 1 , z t − 1 ) P(y_{s-1}, z_{t-1}) P(ys1,zt1)将光泽反射考虑在内,我们这种结合的方法可以高效地采样SDG和GDG路径及其他路径。尽管我们的俄罗斯轮盘赌在许多光源的情况下也会产生路径相关性,但通过设置一个小系数 C C C表示接受概率 P ( y s − 1 , z t − 1 ) P(y_{s-1}, z_{t-1}) P(ys1,zt1),这个误差可以比连接一个眼睛顶点到所有光顶点的误差小很多。

优化

为了提高这个结合方法的效率,本文只在位于光滑表面的眼睛顶点处使用基于俄罗斯轮盘赌的连接,因为概率连接在漫反射表面处的效率更高。另外,在我们的连接方法中,不会重用 y 0 y_0 y0 y 1 y_1 y1(即光源处的光顶点和第一个相交的表面)。这是因为这种连接路径 { y 0 , y 1 , z t − 1 } \{y_0, y_1, z_{t-1}\} {y0,y1,zt1}不可能是SDG或GDG的情况。这个优化操作不仅提高了执行效率和采样效率,也减少了缓存的光顶点的内存占用。

未来工作

限制

完美镜面

分层的俄罗斯轮盘赌不支持完美镜面的表面。因此,在不可连接的镜面-漫反射-镜面(SDS)路径时使用顶点合并方法,如图13所示。
在这里插入图片描述
然而,我们的方法在极端光滑的反射表面处依然可以高效地工作(例如,GGX粗糙度为0.0001),这时再最终渲染处的图片里就很难区分完美的镜面反射和极端光泽的了。

闪烁高光

由于眼睛顶点和光顶点之间的平方逆距离,顶点连接会产生闪烁高光(Fireflies)走样。对于SDG和GDG的双向路径跟踪(BPT)情况,如果使用的是无偏差的方法,闪烁高光在光滑物体的边缘部分是无法避免的。尽管我们的方法明显地减少了闪烁高光走样,但在BPT中,闪烁高光依然会在角落等少量地发生。这是因为俄罗斯轮盘的概率必须限制为小于等于1。然而,这种闪烁高光在后处理阶段可以轻松地移除,如图14b所示。结合使用小合并半径的顶点合并方法也能抑制闪烁高光,如图14c所示。
在这里插入图片描述

路径相关性

对于使用小的接受概率的多顶点连接的俄罗斯轮盘赌,会产生比连接眼睛顶点到所有光顶点方法更少的相关性。然而,当光顶点的分布在局部非常密集时,也可能会产生明显的路径相关性效果,类似VCM。如果启发式的多重重要性采样将光顶点的密度也考虑在内的话,算法的鲁棒性也可以进一步提升。我们推荐读者阅读多重重要性采样的方法来实现将VCM中光顶点的密度也考虑在内的算法。

改进

各向异性折射

在我们的散射波瓣表示方法中,对各向异性的反射使用了现有的球面翘曲方法,然而对于各向异性的折射却没有相应的球面翘曲方法被提出。尽管可以用简单的各项同性球面翘曲来替代,但是对于各项异性的NDF来说会很低效。推导各项异性折射波瓣的球面翘曲将会是我们未来的工作。

多反射波瓣

我们现在实现的分层俄罗斯轮盘方法只适用于单个波瓣的表示情况,因此也应该将其引用于多散射波瓣BRDF的每一个波瓣中。然而,分层俄罗斯轮盘方法只支持表示多散射波瓣的联合椭球。我们将会研究多散射波瓣的高效表示方法。

光顶点处的BRDF

因为我们的方法忽略了光顶点处BRDF的俄罗斯轮盘概率,但对于光滑到光滑相互反射和光滑-漫反射-镜面(GDS,不是SDG路径)路径的情况就很低效。对于GDS路径,我们可以使用所提出的分层俄罗斯轮盘的逆过程,即在光顶点的散射范围和眼睛顶点的BVH间进行相交测试。然而,这种方法必须额外缓存眼睛顶点,并且实现起来也非常复杂。考虑光顶点处BRDF的高效方法也是未来的工作。

问题

问题1

球面翘曲(spherical warping)是什么?
a:类似于17年那篇文章的球面椭圆形。

问题2

为什么可以根据概率密度函数来生成最小值?
a:根据补充材料中公式的推导,这个 u u u是指最小随机数,所以这个PDF表示 N N N个均匀随机数中, u u u为最小随机数的概率。这样就可以根据这个PDF去判断每一个随机数是最小随机数的概率,然后确定哪个是最小的随机数。但是这种方法不高效,所以就需要使用累积分布函数。

问题3

没看出累积分布函数和生成最小随机值之间的逻辑关系。
a:累积分布函数的反函数可以用来生成服从该随机分布的随机变量。因此,若想要生成最小的随机数,则该最小的随机数也必须满足这个分布(必要条件)。累积分布函数可以用来计算从0到某个值( ξ \xi ξ)为止所有随机数为最小随机数的概率和,也就表示最小随机数出现在 [ 0 , ξ ] [0, \xi] [0,ξ]区间内的概率,由于其公式中包含最小随机数,所以用其反函数可以直接求出最小随机数(充分条件)。最后只剩下累积分布函数的反函数的输入参数了,这个参数可以通过随机生成一个数决定,因为都是随机的,所以这个参数随机可以增大随机性。

问题4

怎么计算出的重叠区域的PDF之和为1?
a:可以参考这篇paper的slide
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hierarchical Russian Roulette for Vertex Connections论文研读 的相关文章

随机推荐

  • jar 迁移 mvn 私有库

    将 jar 从一个 mvn 库迁移另一个 mvn 库的办法 1 拉取 jar 到本地 mvn 库 创建拉取项目文件夹 xff0c 文件夹下创建 pom xml xff0c settings xml 两个文件 xff0c 填写要迁移的 jar
  • Elasticsearch 解决 log4j 安全漏洞 - 升级镜像

    一 概论 Apache Log4j 2 被披露出存在严重代码执行漏洞 xff0c 目前官方已发布正式安全公告及版本 xff0c 漏洞编号 xff1a CVE 2021 44228 xff0c 漏洞被利用可导致服务器被入侵等危害 公司 ES
  • Prometheus 实现 podDown 实时告警

    一 需求 每个 pod 重启 删除时 xff0c 都能发出告警 要及时和准确 二 告警架构 集群部署在 k8s 上 xff0c 告警使用 Prometheus 43 alertManager 43 prometheusManager xff
  • prometheus 告警机制 -(为什么告警发的不及时)

    为什么告警有时发的及时 xff0c 有时发的慢 数据异常到监控发出告警的时间与多个参数相关 xff0c 包括采集间隔 xff0c 扫描间隔 xff0c group 发送间隔 xff0c 告警持续时间 for 等 最长的时间为 采集间隔 43
  • prometheus 告警机制 - 我的告警为什么重发

    为什么告警总在重复发 xff0c 有时不重复发 xff0c 怎么避免 告警会在两种情况下重发 告警 group 列表中告警有变更 xff08 增加或者减少 xff09 告警持续到 repeat interval 配置的重发时间 告警 gro
  • linux 盘格式化并挂载

    一 概论 如果 linux 要格式化盘 xff0c 需要先解挂 xff0c 才能格式化 xff0c 格式化的速度比 rm rf 会快 xff0c 作用一样 如果是初始化机器挂载盘 xff08 不要解绑操作 xff09 xff0c 直接查看第
  • grafana 画富集多个指标 label 的表格

    下午5点 xff1a 老哥 xff0c 今天把业务趋势图搞出来吧 一 怎么画表格 我们的需要是做下面的视图 xff0c 他是一个表格 xff0c 而且有着多个数据源 添加图表 填入数据 xff0c 展示原始图形 转换为 table 只显示最
  • [golang] 实现 jwt 方式登录

    1 Jwt 和 Session 登录方案介绍 JSON Web Token xff08 缩写 JWT xff09 是目前流行的跨域认证解决方案 原理是生存的凭证包含标题 header xff0c 有效负载 payload 和签名组成 用户信
  • Stochastic Light Culling for VPLs on GGX Microsurfaces论文研读

    前言 好久没写博客了 xff0c 今天来共享一下最近研读的一篇论文吧 xff0c 文章中 pdf 为参考文献可自行谷歌学术下载 因为本人还是个图形学菜鸟 xff0c 所以有什么问题希望大家多多指正 Stochastic Light Cull
  • 瞎更新,container_cpu_usage_seconds_total{job=“cadvisor“} 怎么没有啦

    一 基本介绍 1 1 概论 1 1 1 故事背景 今天在同步其他团队的 grafana 监控大盘时 xff0c Prometheus 服务报告说不能找到名为 container cpu usage seconds total job 61
  • Prometheus MySQL 性能监控

    一 介绍 Prometheus 是一种开源的监控系统和时序数据库 xff0c 旨在收集和处理大量数据并提供可视化 监控警报等功能 它支持多种语言 多种部署方式 xff0c 并且非常灵活 xff0c 而且社区支持非常活跃 xff0c 为用户提
  • 二、nodeJS 项目架构详解(app.js + Express + Http)

    参考 xff1a https www cnblogs com ostrich sunshine p 7474471 html 其中重点文件 文件夹说明 xff1a techNode xff1a bin www 启动运行 xff08 服务端口
  • centos 安装freeswitch

    首先安装freeswitch的运行库 更新yum yum update 安装依赖 yum install y git gcc c 43 43 wget alsa lib devel autoconf automake bison broad
  • Visio、Matlab高清图片插入word文档的几种方法。

    2023 3 30 直接参考这两个就行了 xff0c 不用花里胡哨的 MATLAB 1 重要的第一步 xff0c 另存为png图片 xff1b 2 导出之前先设置分辨率 xff0c 很多期刊要求600dpi 这一步很关键 Visio 1 重
  • CTF Crypto---RSA NC不互素

    题目 span class token keyword from span Crypto span class token punctuation span Util span class token punctuation span nu
  • 看一看Ubuntu的目录结构

    先了解一下Ubuntu的目录结构 xff0c 对于后面学习Ubuntu软件安装和使用都有帮助 一 Linux没有盘符这个概念 Windows存在多个驱动器盘符 xff0c 每个盘符形成多个树形并列的情形 xff0c Linux没有盘符这个概
  • 【C语言】——结构体进阶:结构体的内存对齐(超详细)

    前言 xff1a 上一篇已经讲了结构体的基本用法 相信各位小伙伴以经学会怎么使用 但是还有一个问题没有弄明白 结构体到底多大 xff0c 占内存空间多不多 xff0c 以经系统到底怎么访问结构体内的数据的 接下来 xff0c 详细分析一下结
  • [OpenCV实战]15 基于深度学习的目标跟踪算法GOTURN

    目录 1 什么是对象跟踪和GOTURN 2 在OpenCV中使用GOTURN 3 GOTURN优缺点 4 参考 在这篇文章中 xff0c 我们将学习一种基于深度学习的目标跟踪算法GOTURN GOTURN在Caffe中搭建 xff0c 现在
  • **在Linux的shell脚本里激活conda 虚拟环境**

    在Linux的shell脚本里激活conda 虚拟环境 之前突发其想 xff0c 既然在命令行可以通过conda activate tf激活tf的虚拟环境 xff0c 那么能不能写个脚本实现呢 xff1f 费了好大劲 xff0c 发现并不行
  • Hierarchical Russian Roulette for Vertex Connections论文研读

    第二篇论文研读文章了 xff0c 虽然依旧很菜 xff0c 但这一篇开始就相对轻松一点了 文档种有些问题 xff0c 其中所有 实时 应该替换为 高效 Hierarchical Russian Roulette for Vertex Con