对于光顶点
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。
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(1−u)N−1其中,
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
mini∈Lξ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∣+∣Lj′∣∣Lj∣其中,
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)
mini∈Lξ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|}
i∈Lroot 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+(1−b)∣L∣1尽管这个分层
[
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|}
i∈Lminξi=b+(1−b)∣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)={b′−b10 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)j∈X∏Pselection (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|
∏j∈XPselection (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)=(b′−b)∣Lroot∣1,其中
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,α)=π(1−vz2+α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=[txTtyTtzT]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θ,α˙)=(1−cosθ+α˙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)=(U−vz+α˙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)∣ωz⋅n∣是系数。对于微平面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)策略,就必须获得采样数和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(ys−1,zt−1)pt(x)其中,
x
‾
\overline{x}
x是根据光子路径
{
y
0
,
.
.
.
,
y
s
−
1
}
\{y_0, ..., y_{s-1}\}
{y0,...,ys−1}和眼睛子路径
{
z
0
,
.
.
.
,
z
t
−
1
}
\{z_0, ..., z_{t-1}\}
{z0,...,zt−1}构建得到的路径,并且
p
t
(
x
‾
)
p_t(\overline{x})
pt(x)表示眼睛顶点
z
t
−
1
z_{t-1}
zt−1处常规顶点连接的PDF。
P
(
y
s
−
1
,
z
t
−
1
)
P(y_{s-1}, z_{t-1})
P(ys−1,zt−1)表示
y
s
−
1
y_{s-1}
ys−1和
z
t
−
1
z_{t-1}
zt−1之间连接的俄罗斯轮盘赌的接受概率。另一方面,概率连接忽略了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(ys−1,zt−1)将光泽反射考虑在内,我们这种结合的方法可以高效地采样SDG和GDG路径及其他路径。尽管我们的俄罗斯轮盘赌在许多光源的情况下也会产生路径相关性,但通过设置一个小系数
C
C
C表示接受概率
P
(
y
s
−
1
,
z
t
−
1
)
P(y_{s-1}, z_{t-1})
P(ys−1,zt−1),这个误差可以比连接一个眼睛顶点到所有光顶点的误差小很多。
优化
为了提高这个结合方法的效率,本文只在位于光滑表面的眼睛顶点处使用基于俄罗斯轮盘赌的连接,因为概率连接在漫反射表面处的效率更高。另外,在我们的连接方法中,不会重用
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,zt−1}不可能是SDG或GDG的情况。这个优化操作不仅提高了执行效率和采样效率,也减少了缓存的光顶点的内存占用。
为什么可以根据概率密度函数来生成最小值? a:根据补充材料中公式的推导,这个
u
u
u是指最小随机数,所以这个PDF表示
N
N
N个均匀随机数中,
u
u
u为最小随机数的概率。这样就可以根据这个PDF去判断每一个随机数是最小随机数的概率,然后确定哪个是最小的随机数。但是这种方法不高效,所以就需要使用累积分布函数。