第二篇论文研读文章了,虽然依旧很菜,但这一篇开始就相对轻松一点了。文档种有些问题,其中所有“实时”应该替换为“高效”。
Hierarchical Russian Roulette for Vertex Connections
主要目标
为了解决双向路径跟踪算法在specular-diffuse-glossy或glossy-diffuse-glossy情况下反射计算低效且质量差的问题,提出了一个分层的俄罗斯轮盘赌技术来进行顶点连接。该技术利用在眼睛子路径(或相机子路径)顶点处的近似散射波瓣来与VPL进行连接,不在波瓣中的VPL便可以直接剔除。由于使用了俄罗斯轮盘赌技术,便可以不需要使用太多的采样点就可提升绘制的质量。
算法细节
符号表格
| Symbol |
Domain |
Description |
| y |
R3 |
光子路径中的顶点 |
| z |
R3 |
眼睛子路径中的顶点 |
| P(y,z) |
[0,1] |
俄罗斯轮盘的概率 |
| n |
S2 |
表面法线 |
| ω |
S2 |
散射波瓣上的一个方向 |
| ω′ |
S2 |
入射方向 |
| ρ(z,ω′,ω) |
[0,∞] |
z处的BRDF |
| qz(ω) |
[0,∞] |
z处的近似散射波瓣 |
| ξi |
[0,1) |
第i个均匀随机数 |
| R(ω;z,ξi) |
[0,∞] |
z处的随机散射范围 |
| D(⋅) |
[0,∞] |
GGX分布 |
| K(⋅) |
[0,1] |
平方椭球波瓣(SEL)函数 |
| αx,αy |
[0,1] |
GGX的粗糙度 |
| α˙x,α˙y |
[0,1] |
SEL的粗糙度 |
| M |
N |
光子路径的数量 |
分层的俄罗斯轮盘赌
在这个方法中,对于所有缓存的光顶点,都会执行一次俄罗斯轮盘赌,并且会将眼睛顶点处的BRDF考虑在内。俄罗斯轮盘赌通过基于范围的剔除来加速,因此就可以从大量的光顶点中高效地采样出一些光顶点。现有的光剔除方法都使用光顶点的范围,而我们使用眼睛顶点的范围来对眼睛子路径跟踪中的每个顶点进行光顶点剔除。本节介绍一种高效的分层的俄罗斯轮盘赌算法。
随机散射范围
对于光顶点y和眼睛顶点z的连接,我们使用下面的俄罗斯轮盘赌的接受概率:P(y,z)=min(∥y−z∥2Cqz(zy),1)其中,C∈[0,∞)是一个用户指定的参数,可用来控制方差和性能之间的权衡。球函数qz(⋅)约等于散射波瓣:qz(ω)≈ρ(z,ω′,ω)∣ω⋅n∣
公式中出现的符号可以在表格中查询。为了对所有缓存了的光顶点进行俄罗斯轮盘的加速操作,就需要通过眼睛顶点在世界空间中的接受范围来剔除那些不重要(被拒绝)的光顶点。使ξi表示第i个均匀随机数,那么眼睛顶点z处在世界空间中的范围的界限就是一个椭球函数,并且给定距离∥y−z∥满足P(y,z)=ξi,其定义如下:R(ω;z,ξi)=ξiCqz(ω)因此,只有在R(ω;z,ξi)范围内的光顶点才会进行顶点连接的操作。
分层拒绝
使用BVH剔除
为了快速地在散射范围R(ω;z,ξi)中寻找光顶点,我们构建了一个光顶点的二分层级包围体(BVH)。使用这个BVH,散射范围和光顶点的包围盒之间的相交测试就可以使用一种自上而下的分层方式进行。然而,尽管散射范围的形状只依赖于近似波瓣qz(ω),但范围的大小却依赖于随机变量C/ξi并且对于不同的光顶点(即叶子节点)来说都是不同的。因此,为了适当地对每一个BVH节点执行相交测试,对于内部节点都使用最大的大小,如图3所示。

这个大小为C/mini∈Lξi,其中L表示该节点包含的叶子节点的索引集。每一个节点都需要能够高效地获得这个最小的随机数mini∈Lξi。
预生成随机数的问题
一种低效的获取每一个节点中最小的随机数的方法就是以自下而上的方式进行预计算。首先,在预处理步骤中将单个随机数分配给每个光顶点,其方法类似于随机光剔除方法。然后,在构建BVH的阶段,将最小随机数从叶子节点传播到更上层的节点。然而,因为对于所有的眼睛顶点都是使用相同的预计算的随机数,这种方法就会在眼睛顶点间产生相关性方差。如果眼睛顶点被密集采样(例如超采样)的话,这种相关性方差会影响计算效率,并且在后处理去噪过程中(例如图片去噪)也会极大地降低效率。为了避免相关性方差,就必须为每一对光顶点和眼睛顶点赋予不同的随机数。但是,在每一个眼睛顶点处都进行一次完全自下而上传播的代价明显是非常昂贵的。所以我们提出了一个实时生成最小随机数的方法,该方法是自上而下的方式并且不会对所有光顶点生成随机数,自然也就不需要自下而上地传播随机数了。
实时生成最小的随机数
我们首先讨论一种时间复杂度为O(1)的方法来在均匀随机数之间生成最小值。然后,我们扩展这个方法为一种自上而下的分层算法,并以此来在每一个BVH节点中生成最小的随机数。为了提升这个算法的数值稳定性,我们采用一种半分层的采样方法,并使用重叠层来生成均匀且部分分层的随机数。
最小随机数的PDF
N个随机数{ξ1,...,ξN}中的最小值可以通过考虑其PDF来生成[问题2]。这个PDF可以通过分析的方法来获得,如下:pmin,N(u)=N(1−u)N−1其中,u∈[0,1),推导过程可参考补充材料。这个PDF的累积分布函数的逆函数也有一个封闭形式的解[问题3]。因此,只需要生成一个单一的均匀随机数ξ∈[0,1)即可随机地生成一个最小随机数,公式如下:min{ξ1,…,ξN}=1−(1−ξ)N1
分层采样

尽管基于以上公式,我们可以使用一种实时的随机数生成方法,但当N很大时会有精度问题(如图4b所示)。然而,对于1维分层采样的情况(因为是对随机数的边界进行分层,所以这里是1维),我们可以避免数值误差并简化公式。由于分层随机数的最小值总是在最低层内,因此,可以简化为:min{ξ1,…,ξN}=Nξ如果u∈[0,1/N],这个情况中的PDF为pmin,N(u)=N;否则pmin,N(u)=0。(注:这里最后的结果显然不能无偏差地生成最小值,所以这里很可能是有了这个最后结果,然后作者为了给这个方法合理性而强行构造的理论。原方法可能是随机地生成一个较小的随机数,然后根据这个较小的随机数来划分一个范围,在这个范围就可以随意均匀生成随机数了,这样就可以保证随机数局部均匀并且较小的随机数很容易得到)
分层生成
使用上一个部分中的方法,在自上而下遍历BVH的过程中,我们可以对每一个节点实时生成一个最小的随机数mini∈Lξi。这是自下而上传播的逆过程。对比自下而上的方式,我们这种自上而下的算法不会对剔除了的节点生成随机数,因此在每一个眼睛顶点进行子路径追踪时的执行效率非常高。

对于我们的BVH来说,父节点的最小随机数一定等于子节点最小随机数中的最小值。因此,在自上而下的分层生成过程中,父节点的最小随机数就会传播给一个子节点(图5中用蓝色节点表示)。然后,对于另一个节点(即图5中的橙色节点),就需要生成一个比其父节点值大的新的最小随机数。继承父节点最小随机数值的子节点是根据子节点中包含的叶子节点数量来随机选择的。这是因为如果所有叶子节点中的随机数是均匀分布的话,那么子树中出现最小值的概率与叶子节点数量成正比。因此,子节点被选中的概率为:Pselection (j)=∣Lj∣+∣Lj′∣∣Lj∣其中,j表示节点的索引,Lj表示j节点包含的叶子节点的索引集,并且j′表示节点j的兄弟节点的索引。对于非分层采样,上面的比父节点值大的新的最小随机数可以用这个公式生成:mini∈Lξi=ξmin+(1−ξmin)(1−(1−ξ)1/∣L∣),其中,ξmin∈[0,1)是父节点传播给其兄弟节点的最小随机数,并且当该节点为根节点时ξmin=0。然而,这种形式在数值上是不稳定的。为了提高分层采样的数值稳定性,我们只对兄弟节点(新生成随机数的节点)的随机数空间进行分层。尽管这种半分层的方法不能保证其兄弟节点的后代节点也是完全分层的,但它可以在叶子节点中生成均匀的随机数。
半分层算法

算法1显示了我们使用实时半分层随机赋值进行分层俄罗斯轮盘赌的伪代码。我们的方法首先在根节点处假定1维的分层采样来生成一个最小的随机数。这个最小的随机数是通过生成一个单一的均匀随机数,然后使用上面的公式来生成的:i∈Lroot minξi=∣Lroot ∣ξ其中,Lroot是根节点包含的所有叶子节点的索引集(即所有缓存的光顶点)。在我们自上而下的算法中,父节点中最小的随机数ξmin会被传播给一个子节点,并且会在另一个子节点中生成一个新的最小随机数。对于这些随机数的传播和生成,我们使用了数值上稳定的分层采样方法。为了对两个兄弟节点之间的随机数空间进行分层以获得最小随机数,我们从父节点中传播其分层的上确界b∈[0,1]到子节点中(包括ξmin)。然后该子节点的兄弟节点使用一个相邻的分层[b,b′)。这个上确界b′∈(b,1]由分层[b,1)和其包含的叶子节点数量∣L∣决定,公式如下:b′=b+(1−b)∣L∣1尽管这个分层[b,b′]会和其兄弟节点的后继节点的分层重叠,但其计算非常简单。使用分层[b,b′],新的最小随机数只需要生成一个单一的均匀随机数就可获得,公式如下:i∈Lminξi=b+(1−b)∣L∣ξ上上个公式是上面这个公式的特殊情况,即对于根节点来说b=0。这个过程在BVH的遍历中会迭代执行。使用这个算法,我们给每一对光顶点和眼睛顶点赋予了不同的随机数,并且不需要在整棵树中执行一次完整的自下而上的遍历。
我们的实时随机数赋值方法将条状走样转换成了高频的噪声。尽管在我们的方法中只是部分分层,但对于性能和数值稳定性来说都是非常有利的。更多的实现细节可以参考补充材料中的c++示例代码。
半分层算法的PDF
我们的半分层算法避免了兄弟节点之间分层的重叠,但它却忽略了兄弟节点的后继节点的完全分层。因此叶子节点的分层会出现重叠的情况。但由于这些重叠的分层的PDF之和总是为1(即均匀分布)[问题4],因此我们的方法是无偏差的。为了在分层[b,b′]之间生成随机数,这个PDF计算如下:P[b,b′)(u)={b′−b10 if u∈[b,b′) otherwise 在某个节点处发生生成事件的概率值为从根节点到该节点处的子选择概率的乘积。根据从该节点到后继节点处子选择概率的乘积,这个生成的随机数会被传播给后代节点。设X为从根节点到某节点的节点索引集,这个生成随机数的PDF为:pX(u)=p[b,b′)(u)j∈X∏Pselection (j)其中,如果j表示根节点,则Pselection(j)=1。当到达叶子节点时,∏j∈XPselection (j)=1/∣Lroot ∣,因此这个PDF变为pX(u)=(b′−b)∣Lroot∣1,其中u∈[b,b′)。图5显示了我们算法中随机数、分层和PDF的生成和传播过程。如该图所示,叶子节点中重叠区域的PDF之和为1。
对接受概率的近似各向异性反射波瓣
虽然随机散射范围R(ω;z,ξi)的形状由qz(ω)所表示的波瓣决定,但理想的形状也应该能简单、高效地进行剔除操作(即在R(ω;z,ξi)和每一个BVH节点间进行相交测试)。尽管一个松弛的包围球可以用来进行保守的相交测试,但其增加了许多误匹配的情况,尤其在各向异性的BRDF中。为了对微平面BRDF的各向异性散射波瓣生成一个更紧密的包围椭球,我们引入了一个平方椭球波瓣(SEL)函数来表示波瓣。对于高效地实现椭球与包围盒的相交测试,可以参考补充材料。
GGX分布
我们的SEL函数是基于GGX分布的:D(ω;Q,αx,αy)=παxαy(vx2/αx2+vy2/αy2+vz2)2χ+(vz)其中,Q=[ωxTωyTωzT]T是一个由波瓣轴ωx,ωy和ωz组成的3×3的正交矩阵,并且[vx,vy,vz]T=QωT是变换到波瓣空间的方向。这个正交矩阵Q表示波瓣的朝向。χ+(vz)是海维赛德函数:当vz>0时值为1,否则为0。对于各向同性的情况,这个分布可以使用α=αx=αy来重写:D(vz,α)=π(1−vz2+α2vz2)2α2χ+(vz)对于微平面BRDF,GGX分布用于法线分布函数(NDF,即微平面法线的分布),其中参数如下:D(ωh;T,αx,αy),ωh=∥ω+ω′∥ω+ω′表示半程向量,正交投影矩阵T=[txT tyT tzT]T由切线tx、副切线ty和平面法线n组成。对于这个情况,[αx,αy]表示平面粗糙度。GGX分布也用于近似散射波瓣(例如基于图片的光照)。在本文中,只有用作为NDF时,GGX分布才被称为GGX NDF。使用GGX近似的散射波瓣被称为GGX散射波瓣。我们使用SEL近似的波瓣是基于GGX散射波瓣的。
平方球波瓣(SSL)
对于微平面BRDF,可用半角近似各项同性GGX分布的散射波瓣:qz(ω)∝D(cos2θ,α˙)其中,θ是位于ω和波瓣轴ωz(即散射波瓣的主导方向)之间的夹角,并且α˙是散射波瓣的粗糙度。这个公式表示的散射范围R(ω;z,ξi)∝qz(ω)就变成了一个球体。在本文中,上面公式的右边没有标准化因子,所以称为平方球波瓣,可以由下式计算:πα˙2D(cos2θ,α˙)=(1−cosθ+α˙2(1+cosθ))24α˙4
平方椭球波瓣(SEL)
即使NDF是各向同性的,微平面BRDF也会生成各向异性的散射波瓣。因为上式是一个各向同性的球函数,所以它不能表示这种各向异性的散射效果。因此,我们将平方球波瓣推导到了平方椭球波瓣(SEL)。我们在生成SEL时使用了两个粗糙度参数[α˙x,α˙y]:K(ω;Q,α˙x,α˙y)=(U−vz+α˙max2(U+vz))24α˙max4
U=(α˙max2/α˙x2)vx2+(α˙max2/α˙y2)vy2+vz2
其中,α˙max=max(α˙x,α˙y)。对于这个公式的推导,可以参考补充材料。这个SEL的平方根是一个简单的椭球,其在波瓣空间中的中心点和半轴分别为[0,0,21−α˙max2]和[α˙x,α˙y,21+α˙max2]。
GGX的近似
尽管GGX是一个半球分布,但SEL是一个椭球函数。然而,对于低粗糙度的情况,可以使用下面的公式来近似:παxαyD(ω;Q,αx,αy)≈K(ω;Q,2αx,2αy)图6显示了不同粗糙度参数时上式的近似准确率。对于较小的粗糙度值,近似误差可以忽略不计。

各向异性散射波瓣的近似
对于使用了多重重要性采样(MIS)的双向路径跟踪(BPT),只有在散射波瓣峰值的附近(即BRDF和cos的乘积),PDF的近似准确率才是重要的。因此,我们在近似的峰值方向ωz使用原始的波瓣值来作为SEL的系数:qz(ω)=cK(ω;Q,α˙x,α˙y)其中,c=ρ(z,ω′,ωz)∣ωz⋅n∣是系数。对于微平面BRDF来说,因为阴影遮罩函数和菲尼尔系数是低频的,所以峰值方向就可以在光滑平面用完美的镜面反射方向ωz=2(ω′⋅n)n−ω′来近似。波瓣轴ωx,ωy和粗糙度[α˙x,α˙y]可以通过分析球面翘曲[问题1]来获得。尽管球面翘曲是通过各向异性球面高斯推导得出,但其仍然可以应用于GGX分布。因此,本文生成SEL的步骤如下:
(1)如果NDF不是GGX,则将它近似为GGX NDF;
(2)GGX散射波瓣在ωz的中心可以用GGX NDF的球面翘曲来计算;
(3)使用上上式可以将GGX散射波瓣转换为SEL。
可以参考附录A来获取更多关于球面翘曲的细节。
集成进双向路径跟踪
本文通过使用多重重要性采样(MIS)来将我们的基于分层俄罗斯轮盘赌的连接方法和概率连接相结合。这是因为我们的连接方法在镜面-漫反射-光泽(SDG)和光泽-漫反射-光泽(GDG)的路径上非常高效,但概率连接在低频的光照效果处也很高效。概率连接根据概率质量函数(PMF)从缓存中为给定的眼睛顶点采样重要的光顶点,该函数会同时考虑可见性、几何项和光顶点及眼睛顶点处的BRDF。然而,概率连接有重用的光子路径的数量限制(例如100条),因为它的计算代价和内存需求与重用的子路径数量及PMF记录数量成正比。在非常光滑的表面处使用成百上千个采样依然不够充分。尽管我们方法在计算范围时忽略了光顶点的可见性和BRDF,但是重用数百万的光子路径可以减轻概率连接和常规顶点连接的限制。
多重重要性采样
为了使用例如平衡启发等强大的多重重要性采样(MIS)策略,就必须获得采样数和PDF。简单的俄罗斯轮盘为M条光子路径详细地给出了采样密度:dt(x)=MP(ys−1,zt−1)pt(x)其中,x是根据光子路径{y0,...,ys−1}和眼睛子路径{z0,...,zt−1}构建得到的路径,并且pt(x)表示眼睛顶点zt−1处常规顶点连接的PDF。P(ys−1,zt−1)表示ys−1和zt−1之间连接的俄罗斯轮盘赌的接受概率。另一方面,概率连接忽略了PMF,而使用pt(x)作为采样密度。这是因为,对于其他技术构建的路径,概率连接无法获得PMF,而考虑到子路径重用导致的路径相关性的最坏情况,样本计数会被修改为1。虽然这种修改对路径相关性来说比较保守,但并没有提高SDG和GDG路径的效率。因为P(ys−1,zt−1)将光泽反射考虑在内,我们这种结合的方法可以高效地采样SDG和GDG路径及其他路径。尽管我们的俄罗斯轮盘赌在许多光源的情况下也会产生路径相关性,但通过设置一个小系数C表示接受概率P(ys−1,zt−1),这个误差可以比连接一个眼睛顶点到所有光顶点的误差小很多。
优化
为了提高这个结合方法的效率,本文只在位于光滑表面的眼睛顶点处使用基于俄罗斯轮盘赌的连接,因为概率连接在漫反射表面处的效率更高。另外,在我们的连接方法中,不会重用y0和y1(即光源处的光顶点和第一个相交的表面)。这是因为这种连接路径{y0,y1,zt−1}不可能是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是指最小随机数,所以这个PDF表示N个均匀随机数中,u为最小随机数的概率。这样就可以根据这个PDF去判断每一个随机数是最小随机数的概率,然后确定哪个是最小的随机数。但是这种方法不高效,所以就需要使用累积分布函数。
问题3
没看出累积分布函数和生成最小随机值之间的逻辑关系。
a:累积分布函数的反函数可以用来生成服从该随机分布的随机变量。因此,若想要生成最小的随机数,则该最小的随机数也必须满足这个分布(必要条件)。累积分布函数可以用来计算从0到某个值(ξ)为止所有随机数为最小随机数的概率和,也就表示最小随机数出现在[0,ξ]区间内的概率,由于其公式中包含最小随机数,所以用其反函数可以直接求出最小随机数(充分条件)。最后只剩下累积分布函数的反函数的输入参数了,这个参数可以通过随机生成一个数决定,因为都是随机的,所以这个参数随机可以增大随机性。
问题4
怎么计算出的重叠区域的PDF之和为1?
a:可以参考这篇paper的slide
