Efficient Rendering of Layered Materials using an Atomic Decomposition with Statistical Operators
Efficient Rendering of Layered Materials using an Atomic Decomposition with Statistical Operators
出处:Laurent Belcour. ACM Transactions on Graphics, Association for Computing Machinery, 2018,37 (4), pp.1.
https://belcour.github.io/blog/research/2018/05/05/brdf-realtime-layered.html
【声明】全文系个人理解,不保证完全符合原文,有可能仅提及到个人关注部分,仅供参考,如需要更多的了解,建议尽量去看原文。
注:引用图片出自原文。
1 摘要
作者提出了一种BSDF模型,通过对光线与微平面几何和介质发生作用后的方向统计的分析,来渲染平面平行的分层材质。该模型的优点是:与参考值近似匹配,并在保持能量守恒的情况下支持任意数量的纹理层,不需要大量的材质预计算,并兼容实时约束。
作者推出了一种新的框架,用于分层材质中光线传输的有效分析和计算。主要包括两个步骤:
1)将光线的传输分解为一系列执行各自方向统计的原子操作。这些操作包括反射、折射、散射和吸收,它们的组合足以用来描述光线在分层结构中多次散射的统计。该文中将使用三个方向矩(能量、均值、方差)来进行总结;
2)扩展增加-倍增方法(Adding-Doubling method),以便有效地支持这些操作的任意组合。
在着色过程中,作者将方向矩映射到BSDF波瓣(BSDF lobes)上。最后验证结果BSDF与轻量级和有效形式的GroundTruth近似匹配。
2 概述
2.1 技术难点
一个关键的技术难点就是提供一个真实的模型:
1)可以处理任意数量的分层(可能是纹理);
2)考虑到多次散射;
3)是能量守恒的;
4)需要较少的内存;
5)较短的预计算时间;
6)支持良好的重要性采样;
7)相对于光传输的计算是对称的(为了与双向渲染技术兼容)。
在追求其中一些目标的过程中,研究者们经常依赖于大量的预计算以及/或者大量数据的制表1来准确地重现目标外观或设计近似的光传输方案2而忽略了一些重要的方面。该文章的目标是达到与制表方法相近的质量,同时提供一种类似于近似方法的轻量级解决方案。
2.2 主要贡献
- 引入了一个统计框架来计算任意一层材质的BSDF的能量、均值和方差(如下图中a)。该框架建立在投影方向的统计上。
- 提供了一组原子操作(反射、折射、吸收和散射),并且推导光线和界面或介质发生作用的近似值(下图中b)。
- 推导出一种新方法,近似于1中,利用统计学,允许我们有效地估算在层结构间多次散射的方向统计(下图中c)。
- 提出一种新的BSDF模型,用于分层材质的离线和实时渲染,保持能量守恒,使用较少的内存,不需要对每种材质进行预计算,有良好的重要性采样(图d)。其中离线BSDF模型是对称的。
2.3 假设和局限
该工作中假设所有界面都是由遵循GGX分布的镜面微平面组成的。文中的近似方法仅支持低粗糙度和中等粗糙度下准确地复现Ground Truth效果,目前的公式不支持其他表面模型,如Lambertian漫反射(Notes: 所有层都未使用漫反射)。
3 方向统计
对于给定的入射光线,估算分层材质的方向统计,并将这些统计应用到BSDF中以获得高效的着色。并使用BSDF波瓣的能量 e e e、均值 μ \mu μ和方差 σ \sigma σ来约束该统计。该方法利用GGX微平面模型,但也同样适用于其他BSDF模型。
3.1 投影平面内统计
为了计算方向均值和方差,我们需要参数化。我们使用这些方向的三维坐标到
(
x
,
y
)
(x,y)
(x,y)平面中的正交投影(如下图a)。也就是,我们对
[
u
,
v
]
=
[
ω
x
,
ω
y
]
[u,v]=[\omega_x, \omega_y]
[u,v]=[ωx,ωy]计算均值和方差,其中
a
x
a_x
ax表示向量
a
a
a的
x
x
x分量。我们可以发现,在这个空间中,各向同性的GGX峰近似于圆形。这里将利用这个性质,并假设投影后的BSDF是径向对称函数,这样就只需要跟踪一个一维方差。注意对于掠射角,GGX是倾斜的。而由于GGX波瓣是由能量、入射方向和粗糙度参数化的,我们就无法控制这个分布的高阶统计。
3.2 等价粗糙度
BSDF波瓣在卷积下是不稳定的,因此,统计指定一个等价的波瓣,这是一种近似,因为球面函数的形状未被保留。该文中将利用粗糙度和方差及其倒数之间的映射来显示和使用方向统计的等价粗糙度。
4 统计的原子操作
4.1 粗糙界面的反射
反射的计算可以根据BRDF:
L
o
(
ω
o
)
=
∫
Ω
F
(
<
ω
i
,
h
>
)
G
(
ω
i
,
ω
o
)
D
(
h
)
4
<
ω
i
,
n
>
<
ω
o
,
n
>
L
i
(
ω
i
)
<
ω
i
,
n
>
d
ω
i
L_o(\omega_o) = \int_\Omega F(<\omega_i, h>)\frac{G(\omega_i,\omega_o)D(h)}{4<\omega_i,n><\omega_o,n>}L_i(\omega_i)<\omega_i,n>d\omega_i
Lo(ωo)=∫ΩF(<ωi,h>)4<ωi,n><ωo,n>G(ωi,ωo)D(h)Li(ωi)<ωi,n>dωi
这里只包含了镜面反射部分,原因在2.3中有介绍,公式比较好理解,这里就不一一介绍各变量的含义了(
h
h
h为半程向量)。
- 能量
被表面反射的能量被称为方向反照率(directional albedo)。对于微平面模型,可以直接通过菲涅尔FGD积分来定义:
F G D = ∫ Ω F ( < ω i , h > ) G ( ω i , ω o ) D ( h ) 4 < ω i , n > < ω o , n > < ω i , n > d ω o FGD=\int_\Omega F(<\omega_i, h>)\frac{G(\omega_i,\omega_o)D(h)}{4<\omega_i,n><\omega_o,n>}<\omega_i,n>d\omega_o FGD=∫ΩF(<ωi,h>)4<ωi,n><ωo,n>G(ωi,ωo)D(h)<ωi,n>dωo
之后将使用 F G D = F G D ( ω i , α , η + i k ) FGD=FGD(\omega_i, \alpha, \eta + \mathbf{i}k) FGD=FGD(ωi,α,η+ik),其中 η + i k \eta + \mathbf{i}k η+ik为界面处的折射率(Index of Refraction, IOR)复数(之所以是复数,是考虑了电解质和绝缘材质的情况,其中电解质为复数,绝缘材质为实数)。对于各向同性BRDF,使用仰角(Elevation)来参数化入射方向。可以通过FGD与入射辐射度来近似出射辐射度的能量:
∫ Ω L o ( ω o ) d ω o ≃ F G D × ∫ Ω L i ( ω i ) d ω i \int_\Omega L_o(\omega_o)d\omega_o \simeq FGD \times \int_\Omega L_i(\omega_i)d\omega_i ∫ΩLo(ωo)dωo≃FGD×∫ΩLi(ωi)dωi
由于FGD不存在近似形式,因此本文在4D表格中预计算FGD,该表格由仰角,粗糙度,IOR复数参数化。 - 均值
Largarde and De Rousiers3表明反射波瓣的均值向法线方向移动。这通常用于视频游戏引擎中获取预积分环境贴图。注意这个移动是直接集成到FGD纹理中的,他们展示了对该移动的一个很好的近似:
ω r ∣ x y ′ = β n ∣ x y + ( 1 − β ) ω r ∣ x y \omega_{r|xy}'=\beta n_{|xy}+(1-\beta)\omega_{r|xy} ωr∣xy′=βn∣xy+(1−β)ωr∣xy
其中 ω ∣ x y = [ ω . x , ω . y ] \omega_{|xy}=[\omega.x,\omega.y] ω∣xy=[ω.x,ω.y]为向量在切线平面, β \beta β取决于阴影遮挡项。然而该移动仅对于粗略概念要为重要,在计算BSDF过程中会忽略。它可以在之后的着色过程中用于矫正预积分环境贴图的错位。 - 方差
粗糙表面会增加入射分布的方差。然而,这种增加与粗糙度不是线性关系。对于低粗糙度( α < 0.2 \alpha < 0.2 α<0.2),方差是近似线性的。而对于较高的粗糙度,可以找到一个空间,其中粗糙反射具有线性行为(可参考原文附录A)。那么,光线在粗糙度分别为 α 1 \alpha 1 α1和 α 2 \alpha 2 α2的平行表面上反射两次的方差为:
σ 12 = f ( α 1 ) + f ( α 2 ) \sigma_{12}=f(\alpha_1)+f(\alpha_2) σ12=f(α1)+f(α2)
其中 f ( α ) f(\alpha) f(α)为方差对于粗糙度的转换关系(下图b)。根据粗糙度线性计算方差公式:
σ = f ( α ) ≈ a 1.1 ( 1 − a 1.1 ) \sigma=f(\alpha)\approx \frac{a^{1.1}}{(1-a^{1.1})} σ=f(α)≈(1−a1.1)a1.1
这种转换并不能完美的满足线性空间映射,但能很好地近似出光线在中等粗糙度微平面界面的两次反射的出射方向的统计(如下图a)。
注:该图展示了光线在具有不同微平面几何的平行分层上两次反射的等价粗糙度,其中使用的垂直入射光( ∣ μ i ∣ = 0 |\mu_i|=0 ∣μi∣=0)。第一层用颜色表示为从红色( α = 0 \alpha=0 α=0)到蓝色( α = 1 \alpha=1 α=1),第二层是由横坐标指定。等价粗糙度并不线性依赖于输入粗糙度。我们发现一种变换(b)将粗糙度映射到方差空间进行反射,其中虚线表示近似结果。
- 能量守恒
经典微平面理论只考虑在微观几何的单个散射,因此忽略了微观几何中由多次反射产生的能量。根据Heitz等人提出的方向反照率(directional albedo)的比例因子可以很好地近似多次散射。因此,这应该不会影响到均值和方差,而只影响能量项。我们在预计算过程中直接将其并入到 F G D FGD FGD项中。对于一个粗糙界面,我们使用 F G D ∞ FGD^{\infty} FGD∞代替之前定义的 F G D FGD FGD项,这里的 F G D ∞ FGD^{\infty} FGD∞为Heitz等人的模型进行随机估算的结果,这个新表具有相同的4D参数化。 - 总结
给定一个能量为 e i e_i ei,均值为 μ i \mu_i μi和方差为 σ i \sigma_i σi的入射方向函数,反射能量 e R e_R eR,均值 μ R \mu_R μR和方差 σ R \sigma_R σR近似为:
e R = e i × F G D ∞ e_R=e_i \times FGD^{\infty} eR=ei×FGD∞
μ R = − μ i \mu_R=-\mu_i μR=−μi
σ R = σ i + f ( α ) \sigma_R=\sigma_i + f(\alpha) σR=σi+f(α)
4.2 粗糙界面的折射
粗糙电解质界面使得光线分布在局部方向上的上半球和下半球,即所谓的BTDF。我们使用 η 12 = η 1 η 2 \eta_{12}=\frac{\eta_1}{\eta_2} η12=η2η1表示两种介质的折射率。
- 能量
粗糙电解质界面的入射角域的能量比例由( 1 − F G D ∞ 1-FGD^{\infty} 1−FGD∞)给定,这也保证了反射和折射方向区域的能量守恒。 - 均值
对于粗糙界面,透射波瓣峰并不是折射后的入射方向。平均折射方向取决于粗糙度(如下图)和折射率。在掠射角下,对于较高的折射率,波瓣峰与折射后的入射方向偏离更多。而我们根据经验发现使用纯折射方向也是有效的。
注:该图显示了对于不同的折射率,透射波瓣( μ t = sin ( θ t ) \mu_t=\sin(\theta_t) μt=sin(θt))相对于入射方向(由 ∣ μ i ∣ = ∣ sin ( θ i ) ∣ |\mu_i|=|\sin(\theta_i)| ∣μi∣=∣sin(θi)∣指定)的均值。我们还显示了折射后方向 sin ( θ r ) \sin(\theta_r) sin(θr)(虚线)。可以看到,粗糙度较低时,平均透射方向与折射方向的偏差非常小,而粗糙度较高时偏差相对较明显。
- 方差
根据Snell定律,光线在穿过电解质界面时会发生折射。同样,在透射时,入射方差也会根据折射率进行缩放。和反射的情况类似,缩放的入射方差会因为表面粗糙度增加而增加。我们可以像考虑反射中一样来推导透射的这种性质。对于相同的粗糙度和入射方向,折射和透射的波瓣具有不同的宽度(如下图)。
注:对于相同的粗糙度,折射波瓣(蓝色)和反射波瓣(红色)具有不同的角宽度。对于入射角度为30°时,根据出射角的正弦值( sin ( ω ) \sin(\omega) sin(ω))来分析两者。将反射率和透射率调整为1来比较两者的波瓣宽度。
我们使用透射粗糙度的概念来分析透射波瓣的方差。这种思想是利用界面下面的反射来模拟透射波瓣(如下图a中绿色)。为了匹配透射波瓣参考值,我们缩放了模拟透射的粗糙度。对于拉伸不变的微平面分布,该缩放s为透射和反射的半程向量(half-vector)切线的导数之比(原文中附录B有详细的推导过程):
s
=
1
2
[
1
+
η
12
<
ω
i
,
n
>
<
ω
t
,
n
>
]
s=\frac{1}{2} \left [1+\eta_{12}\frac{<\omega_i , n>}{<\omega_t,n>} \right ]
s=21[1+η12<ωt,n><ωi,n>]
注:为了计算方差,我们利用一个新的入射方向( μ r = η 12 μ i \mu_r=\eta_{12}\mu_i μr=η12μi,左图绿色)和粗糙反射来模拟一个粗糙折射。这里使用的透射粗糙度为 α r = s × α \alpha_r=s \times \alpha αr=s×α,其中 α \alpha α为微几何的粗糙度。这里展示了我们模拟的折射(右图绿色)和参考曲线(右图蓝色)近似吻合,而Kulla和Conty的方法4(右图红色)要高一些。
- 总结
给定一个能量为 e i e_i ei,均值为 μ i \mu_i μi和方差为 σ i \sigma_i σi的入射方向函数,透射能量 e T e_T eT,均值 μ T \mu_T μT和方差 σ T \sigma_T σT近似为:
e T = e i × ( 1 − F G D ∞ ) e_T=e_i \times (1-FGD^{\infty}) eT=ei×(1−FGD∞)
μ T = − η 12 μ i \mu_T=-\eta_{12}\mu_i μT=−η12μi
σ T = σ i η 12 + f ( s × α ) \sigma_T=\frac{\sigma_i}{\eta_{12}} + f(s \times \alpha) σT=η12σi+f(s×α)
4.3 体积吸收
- 能量
Beer-Lambert定律描述了入射光被随机材质的衰减。入射辐射度会根据光学深度而缩小(这里的光学深度可以理解为光在介质中行进的距离)。
L o ( ω o ) = e x p [ − σ t h < ω o , n > ] L i ( ω o ) L_o(\omega_o)=exp\left [ -\sigma_t \frac{h}{<\omega_o,n>} \right ]L_i(\omega_o) Lo(ωo)=exp[−σt<ωo,n>h]Li(ωo)
其中 σ t \sigma_t σt为透射横切面, h h h为层深度,我们可以使用入射平均衰减来近似平均能量:
e o = e i e x p ( − σ t h < ω o , n > ) e_o=e_i exp(-\frac{\sigma_th}{<\omega_o,n>}) eo=eiexp(−<ωo,n>σth) - 均值和方差
由于底层和顶层之间的光学深度取决于入射方向,因此平均值和方差也会被影响(如下图a中的方差)。我们发现吸收对均值和方差的影响可以忽略不计。
该图利用Henyey-Greenstein(HG)分析函数展示了介质层吸收(a)和散射(b)的等价粗糙度。对于吸收,我们使用不同的光学深度(从红色 h = 0 h=0 h=0到蓝色 h = 1 h=1 h=1)。对这两张图,我们改变各向异性参数 g ∈ [ 0 , 1 ] g \in [0,1] g∈[0,1]。本文近似的HG粗糙度(红色)和参考曲线(蓝色)近似拟合。
- 总结
给定一个能量为 e i e_i ei,均值为 μ i \mu_i μi和方差为 σ i \sigma_i σi的入射方向函数,体积吸收能量 e A e_A eA,均值 μ A \mu_A μA和方差 σ A \sigma_A σA近似为:
e A = e i e x p ( − σ t h < ω o , n > ) e_A=e_i exp(-\frac{\sigma_th}{<\omega_o,n>}) eA=eiexp(−<ωo,n>σth)
μ A = − μ i \mu_A=-\mu_i μA=−μi
σ A = σ i \sigma_A=\sigma_i σA=σi
4.4 体积散射
在本节中,我们只研究光学上均匀的薄板,高度为
h
h
h,不发光。在这种情况下,单个散射占主要部分,我们可以忽略多次散射。假设光线进入到薄板
L
i
(
ω
)
L_i(\omega)
Li(ω)中,则光线被介质散射的量为5:
L
o
(
ω
)
=
σ
s
∫
0
h
e
x
p
[
−
σ
t
t
<
ω
,
n
>
]
L
s
(
t
,
ω
)
d
t
L_o(\omega)=\sigma_s \int_{0}^{h}exp\left [ -\frac{\sigma_t t}{<\omega,n>} \right ]L_s(t,\omega)dt
Lo(ω)=σs∫0hexp[−<ω,n>σtt]Ls(t,ω)dt
L
s
(
t
,
ω
)
=
∫
S
2
p
(
ω
i
,
ω
)
e
x
p
[
−
σ
t
(
h
−
t
)
<
ω
i
,
n
>
]
L
i
(
ω
i
)
d
ω
i
L_s(t,\omega)=\int_{S^2}p(\omega_i,\omega)exp\left [ -\frac{\sigma_t (h-t)}{<\omega_i,n>} \right ]L_i(\omega_i)d\omega_i
Ls(t,ω)=∫S2p(ωi,ω)exp[−<ωi,n>σt(h−t)]Li(ωi)dωi
其中
σ
s
\sigma_s
σs为散射横切面。
- 能量和均值
假设该相位函数(phase function)为强正向散射(大部分能量向前散射),我们使用在入射光线的平均方向上估算的衰减来近似输出能量:
∫ Ω L o ( ω ) d ω ≈ σ s ⋅ h ⋅ e x p [ − σ t h < ω i , n > ] ∫ Ω L i ( ω ) d ω \int_\Omega L_o(\omega)d\omega \approx \sigma_s \cdot h \cdot exp\left [ -\frac{\sigma_t h}{<\omega_i,n>} \right ]\int_\Omega L_i(\omega)d\omega ∫ΩLo(ω)dω≈σs⋅h⋅exp[−<ωi,n>σth]∫ΩLi(ω)dω
该近似假设相位函数不会在向后的方向上损失能量。然而,可以通过调节相位函数向前散射的光线的能量来解释后向散射。对于 g > 0.7 g>0.7 g>0.7,这种调节是没必要的。对于吸收,经验上可以发现,对于正向相位函数,散射不会显著改变均值。 - 方差
对于粗糙界面,入射方差随着相位函数的前向宽度而增加6。这里用了一个经验性的对Henyey-Greenstein相位函数(HG)在前向的等价GGX粗糙度:
σ g = [ 1 − g g ] 0.8 1 1 + g \sigma_g=\left[ \frac{1-g}{g} \right]^{0.8} \frac{1}{1+g} σg=[g1−g]0.81+g1
其中 g g g为HG的各向异性因子。然而HG相位函数在 g ≪ 0.7 g\ll 0.7 g≪0.7可能存在一个不可忽略的后向散射。这在方向统计中产生了两种模式,需要在我们的方法中分别处理。这里将重点放在前向散射上,后向散射的方差放在未来的工作中去考虑。 - 总结
给定一个能量为 e i e_i ei,均值为 μ i \mu_i μi和方差为 σ i \sigma_i σi的入射方向函数,体积散射能量 e S e_S eS,均值 μ S \mu_S μS和方差 σ S \sigma_S σS近似为:
e S = e i σ s h < ω o , n > e x p ( − σ t h < ω o , n > ) e_S=e_i\frac{\sigma_s h}{<\omega_o,n>} exp(-\frac{\sigma_th}{<\omega_o,n>}) eS=ei<ωo,n>σshexp(−<ωo,n>σth)
μ S = − μ i \mu_S=-\mu_i μS=−μi
σ S = σ i + σ g \sigma_S=\sigma_i+\sigma_g σS=σi+σg
5 多层统计
出射光有许多条光线路径(如TRT透射-反射-透射,TRRRT,…),前面的统计分析模型模拟了个过程(如完整的TRT路径)。我们需要以一种有效的方式来组合这些统计数据。因此需要使用增加-倍增方法(Adding-Doubling method)。
5.1 增加-倍增方法
增加-倍增方法需要定义关于光传播方向上的辐射系数反射
r
r
r和透射
t
t
t:
r
k
k
+
1
r_{k\ k+1}
rk k+1为光向下传播的薄板的反射系数,
r
k
+
1
k
r_{k+1\ k}
rk+1 k为光向上传播的薄板的反射系数,界面中无光源时,光线向上离开界面可以表示为:
l
o
+
=
r
12
l
i
−
+
t
21
l
i
+
l_o^+ = r_{12}l_i^-+t_{21}l_i^+
lo+=r12li−+t21li+
理解为:从平板向上传播的光,是由平板反射的向下传播的入射光,加上由平板透射的向上传播的入射光。
同理,可以表示从平板向下传播的光:
l
o
−
=
r
21
l
i
+
+
t
12
l
i
−
l_o^- = r_{21}l_i^++t_{12}l_i^-
lo−=r21li++t12li−
注:给定层透射率和反射率 r 12 r_{12} r12, t 12 t_{12} t12, r 21 r_{21} r21, t 21 t_{21} t21(如左图, η 1 \eta_1 η1, η 2 \eta_2 η2)。增加-倍增方法对层栈计算散射(右图),并考虑层间的相互反射。
我们可以表示两层
r
12
r_{12}
r12和
r
23
r_{23}
r23之间的全局向上反射的光传输为:
r
13
=
r
12
+
t
12
r
23
t
21
+
t
12
r
23
2
r
21
t
21
+
.
.
.
=
r
12
+
∑
k
=
0
∞
t
12
r
23
k
+
1
r
21
k
t
21
r_{13}=r_{12}+t_{12}r_{23}t_{21}+t_{12}r_{23}^2r_{21}t_{21}+...=r_{12}+\sum_{k=0}^{\infty} t_{12}r_{23}^{k+1}r_{21}^kt_{21}
r13=r12+t12r23t21+t12r232r21t21+...=r12+k=0∑∞t12r23k+1r21kt21
这种形式考虑到在两层之间的所有反弹。可以用一个等比数列的解析形式来总结:
r
13
=
r
12
+
t
12
r
23
t
21
(
1
−
(
r
23
r
21
)
∞
)
1
−
r
23
r
21
≃
r
12
+
t
12
r
23
t
21
1
−
r
23
r
21
r_{13}=r_{12}+\frac{t_{12}r_{23}t_{21}(1-(r_{23}r_{21})^{\infty})}{1-r_{23}r_{21}}\simeq r_{12}+\frac{t_{12}r_{23}t_{21}}{1-r_{23}r_{21}}
r13=r12+1−r23r21t12r23t21(1−(r23r21)∞)≃r12+1−r23r21t12r23t21
同理,我们可以表示全局向上透射为:
t
31
=
t
32
t
21
1
−
r
23
r
21
t_{31}=\frac{t_{32}t_{21}}{1-r_{23}r_{21}}
t31=1−r23r21t32t21
也可以表示向下反射和透射:
r
31
=
r
32
+
t
32
r
21
t
23
1
−
r
23
r
21
r_{31}= r_{32}+\frac{t_{32}r_{21}t_{23}}{1-r_{23}r_{21}}
r31=r32+1−r23r21t32r21t23
t
13
=
t
12
t
23
1
−
r
23
r
21
t_{13}=\frac{t_{12}t_{23}}{1-r_{23}r_{21}}
t13=1−r23r21t12t23
增加算法随着界面数量的增加迭代地表示反射和透射,通过使用
r
13
r_{13}
r13,
t
13
t_{13}
t13,
r
31
r_{31}
r31,
t
31
t_{31}
t31作为虚拟界面的反射率和透射率。
这种方法还可以使用倍增算法计算任意深度的均匀介质的多次散射。这里我们将相同层整合起来来生成一个两倍深度的虚拟层,此时
r
12
=
r
23
r_{12}=r_{23}
r12=r23,
t
12
=
t
23
t_{12}=t_{23}
t12=t23,
r
21
=
r
32
r_{21}=r_{32}
r21=r32,
t
21
=
t
32
t_{21}=t_{32}
t21=t32。通过在非常小的输入层(通常h=10-8)上迭代此操作,我们可以将层深度增加到任意大小。
利用增加-倍增算法,我们现在可以计算分层BSDF的方向Albedo。只需要使用不同的
r
r
r和
t
t
t项值。对于一个粗糙表面,我们有
r
12
=
F
G
D
∞
r_{12}=FGD^\infty
r12=FGD∞,
t
12
=
1
−
F
G
D
∞
t_{12}=1-FGD^\infty
t12=1−FGD∞,
r
21
=
F
G
D
∞
r_{21}=FGD^\infty
r21=FGD∞,
t
21
=
1
−
F
G
D
∞
t_{21}=1-FGD^\infty
t21=1−FGD∞。
5.1.1 全反射
虽然增加-倍增算法允许近似两层之间的多次散射,但却在一定程度上忽略了上部菲涅尔界面对全反射光的影响。在光滑界面的情况下,存在某些角度设置使得没有光发生折射,电解质界面的行为像完全的镜子。这种行为就被称为全反射(Total Internal Reflection,TIR)。透射率
t
21
t_{21}
t21不能解释光线在界面2→3上反射的角度展开,我们需要重新获取该信息:
L
t
(
ω
o
)
=
∫
Ω
L
i
(
ω
i
)
T
(
ω
t
)
ρ
(
ω
i
,
ω
t
,
α
23
)
d
ω
t
L_t(\omega_o)=\int_\Omega L_i(\omega_i)T(\omega_t) \rho(\omega_i,\omega_t,\alpha_{23}) d \omega_t
Lt(ωo)=∫ΩLi(ωi)T(ωt)ρ(ωi,ωt,α23)dωt
其中
ω
t
=
r
e
f
r
a
c
t
(
ω
o
,
η
12
)
\omega_t=refract(\omega_o,\eta_{12})
ωt=refract(ωo,η12),
T
(
ω
t
)
=
1
−
F
(
ω
t
)
T(\omega_t)=1-F(\omega_t)
T(ωt)=1−F(ωt)为Frenel透射,
ρ
(
ω
i
,
ω
t
,
α
23
)
\rho(\omega_i,\omega_t,\alpha_{23})
ρ(ωi,ωt,α23)为层2→3的微平面BRDF。当出现TIR时,
T
(
ω
i
)
=
0
T(\omega_i)=0
T(ωi)=0。计算由TIR引起的能量损失的一种方法时将其计算从传输积分中解耦出来:
L
t
(
ω
o
)
=
∫
Ω
L
i
(
ω
i
)
ρ
(
ω
i
,
ω
t
,
α
23
)
d
ω
t
×
∫
Ω
(
1
−
F
(
ω
t
)
)
D
(
ω
t
,
α
23
)
d
ω
i
L_t(\omega_o) = \int_\Omega L_i(\omega_i)\rho (\omega_i, \omega_t, \alpha_{23})d\omega_t \times {\color{Red} \int_\Omega(1-F(\omega_t))D(\omega _t,\alpha_{23})d\omega_i}
Lt(ωo)=∫ΩLi(ωi)ρ(ωi,ωt,α23)dωt×∫Ω(1−F(ωt))D(ωt,α23)dωi
这里红色部分即为TIR。其中
D
(
ω
t
,
α
23
)
D(\omega _t,\alpha_{23})
D(ωt,α23)为NDF。这里的第二个积分类似于FGD表,我们可以预计算并保存在一个3D表中。这种解耦通常会产生良好的结果。在增加-倍增算法中,我们将
r
21
r_{21}
r21和
t
21
t_{21}
t21替换为:
r
21
←
r
21
+
(
1
−
T
I
R
)
×
t
21
r_{21}←r_{21}+(1-TIR) \times t_{21}
r21←r21+(1−TIR)×t21
t
21
←
T
I
R
×
t
21
t_{21}←TIR \times t_{21}
t21←TIR×t21
5.2 方差的增加-倍增
由4.1~4.4,和界面或介质发生作用的方差具有一种仿射形式。具有相同均值的分布的加权和的方差是单个方差的加权算术平均值。这些性质允许使用增加-倍增算法来计算层间多次散射的方差。
5.2.1 多次散射
给定两个界面,多次散射的非标准化平均方差
σ
~
13
R
\tilde{\sigma}_{13}^R
σ~13R为:
σ
~
13
R
=
r
12
σ
12
R
+
∑
k
=
0
+
∞
[
t
12
r
23
k
+
1
r
21
k
t
21
]
[
σ
12
T
+
(
(
k
+
1
)
s
23
R
+
k
σ
21
R
)
J
21
+
σ
21
T
]
\tilde{\sigma}_{13}^R=r_{12}\sigma_{12}^R+\sum_{k=0}^{+\infty}\left [t_{12}r_{23}^{k+1}r_{21}^kt_{21} \right ]\left [\sigma_{12}^T+\left ((k+1)s_{23}^R+k\sigma_{21}^R \right )J_{21}+\sigma_{21}^T\right ]
σ~13R=r12σ12R+k=0∑+∞[t12r23k+1r21kt21][σ12T+((k+1)s23R+kσ21R)J21+σ21T]
其中
s
i
j
R
s_{ij}^R
sijR(或
s
i
j
T
s_{ij}^T
sijT)为在折射率分别为
i
i
i和
j
j
j的粗糙界面反射(或透射)时的附加方差,其中
J
i
j
J_{ij}
Jij为透射缩放因子。这个公式可以分为一个等比数列和一个算术等比数列。我们知道这个等比数列具有解析解。算术等比数列具有以下解析形式:
∑
k
=
0
+
∞
k
r
k
=
r
(
1
−
r
)
2
,
r
∈
[
0
,
1
]
\sum_{k=0}^{+\infty}kr^k=\frac{r}{(1-r)^2},r\in [0,1]
k=0∑+∞krk=(1−r)2r,r∈[0,1]
由于
r
23
r
21
<
1
r_{23}r_{21}<1
r23r21<1(或者没有光线可以进入该层),那么前面的方差公式可以简化为:
σ
~
13
R
=
r
12
σ
12
R
+
[
t
12
r
23
t
21
1
−
r
23
r
21
]
[
σ
12
T
+
σ
21
T
+
(
s
23
R
+
r
23
r
21
1
−
r
23
r
21
σ
21
R
)
J
21
]
\tilde{\sigma}_{13}^R=r_{12}\sigma_{12}^R+\left [\frac {t_{12}r_{23}t_{21}}{1-r_{23}r_{21}} \right ]\left [\sigma_{12}^T+\sigma_{21}^T+\left (s_{23}^R+\frac{r_{23}r_{21}}{1-r_{23}r_{21}}\sigma_{21}^R \right )J_{21}\right ]
σ~13R=r12σ12R+[1−r23r21t12r23t21][σ12T+σ21T+(s23R+1−r23r21r23r21σ21R)J21]
(原文中附录C中有详细的推导)
这将用于下文中替代
σ
12
R
\sigma_{12}^R
σ12R和
σ
12
T
\sigma_{12}^T
σ12T,对于介质,我们使用
σ
12
R
=
0
\sigma_{12}^R=0
σ12R=0,
σ
21
R
=
0
\sigma_{21}^R=0
σ21R=0,
σ
12
T
=
σ
g
\sigma_{12}^T=\sigma_g
σ12T=σg,
σ
21
T
=
σ
g
\sigma_{21}^T=\sigma_g
σ21T=σg,
J
21
=
1
J_{21}=1
J21=1,
J
21
=
1
J_{21}=1
J21=1。
5.2.2 增加-倍增
使用多测散射公式,我们可以建立一个增加-倍增算法。以一个空层开始,即 e i j R = e j i R = 0 e_{ij}^R=e_{ji}^R=0 eijR=ejiR=0, e i j T = e j i T = 1 e_{ij}^T=e_{ji}^T=1 eijT=ejiT=1,和 σ i j R = σ j i R = σ i j T = σ j i T = 0 \sigma_{ij}^R=\sigma_{ji}^R=\sigma_{ij}^T=\sigma_{ji}^T=0 σijR=σjiR=σijT=σjiT=0。对于栈中的每个界面(由最上到最下),我们将多次散射公式应用到能量和方差上,我们还需要在过程中跟踪折射比例因子 J i j J_{ij} Jij和 J j i J_{ji} Jji。
5.2.3 局限
注意这些推导假设所有的波瓣都近似具有相同的均值方向。因此,如果么有特殊情况处理,这里的增加-倍增方法就不能处理多模BSDF。例如为了处理回归反射相位函数(如HG中 g < 0 g<0 g<0),我们需要跟踪另外一组回归反射方向的统计。
6 实现
在这些基础上,我们开发了两个BSDF模型:一个用于前向路径跟踪和实时渲染,即前向(Forward)模型,另一个用于双向光线传输算法,即对称(Symmetric)模型。
6.1 前向模型
如下图中,为了估算BSDF,我们从一个单位能量为
e
i
=
1
e_i=1
ei=1,入射均值
μ
i
=
[
ω
i
∣
x
,
ω
i
∣
y
]
\mu_i=[\omega_{i|x},\omega_{i|y}]
μi=[ωi∣x,ωi∣y],零方差
σ
i
=
0
\sigma_i=0
σi=0开始,并估算增加-倍增方法以收集中间方差(见原文中附录C)和能量放在一个BRDF波瓣的向量中。对于透射波瓣,我们在增加-倍增算法的末尾记录透射统计。向量的每个通道对应一个BSDF波瓣并包含能量
e
i
e_i
ei、均值
μ
i
\mu_i
μi和方差
σ
i
\sigma_i
σi。从这个统计向量,我们实例化一个近似BSDF模型,包含微平面GGX波瓣的加权求和,其中Fresnel
e
k
e_k
ek,入射方向反射率
μ
k
\mu_k
μk和粗糙度
f
−
1
(
σ
k
)
f^{-1}(\sigma_k)
f−1(σk)。对透射波瓣,我们使用我们的模拟折射模型。因此,反射和透射模型为:
ρ
(
ω
i
,
ω
o
)
=
∑
k
=
0
N
e
k
ρ
k
(
ω
k
,
ω
o
,
α
k
)
\rho(\omega_i,\omega_o)=\sum_{k=0}^{N}e_k\rho_k(\omega_k,\omega_o,\alpha_k)
ρ(ωi,ωo)=k=0∑Nekρk(ωk,ωo,αk)
其中
α
k
=
f
−
1
(
σ
k
)
\alpha_k=f^{-1}(\sigma_k)
αk=f−1(σk)
ω
k
=
r
e
f
l
e
c
t
(
μ
k
)
\omega_k=reflect(\mu_k)
ωk=reflect(μk)
ρ
k
(
ω
k
,
ω
o
,
α
k
)
=
D
(
h
)
G
(
ω
k
,
ω
o
)
4
<
ω
k
,
n
>
<
ω
o
,
n
>
\rho_k(\omega_k,\omega_o,\alpha_k)=\frac{D(h)G(\omega_k,\omega_o)}{4<\omega_k,n><\omega_o,n>}
ρk(ωk,ωo,αk)=4<ωk,n><ωo,n>D(h)G(ωk,ωo)
其中
e
k
e_k
ek,
ω
k
\omega_k
ωk和
σ
k
\sigma_k
σk分别为第k个波瓣的能量,均值和方差。为了提高性能,可以合并一些方差(先按能量比例缩放,然后在按总能量归一化)。在我们的实现中,我们按原样保留所有波瓣。
注:我们从入射方向开始跟踪BRDF波瓣统计(a)。我们使用增加-倍增算法迭代地估算输出波瓣的向量(b-c)。最后我们使用统计的向量和逆映射实例化一组BRDF波瓣。这个过程输出和层数一样多的波瓣。可以通过将统计合并在一起减少BRDF实例的数量。
6.1.1 重要性采样和MIS
由于我们的模型是多个波瓣的加权平均值,我们根据能量和重要性采样基于模拟入射方向和粗糙度的可见法线随机选择一个。然而这种策略并不是最佳的,且会因为不同的波瓣重叠产生噪声。为了避免这种情况,我们使用平衡启发式对不同的波瓣进行多次重要性采样。BRDF波瓣采样的贡献为:
p
=
e
a
l
l
∑
i
=
0
N
e
i
p
i
∑
i
=
0
N
e
i
ρ
i
(
ω
k
,
ω
o
,
α
k
)
p=\frac{e_{all}}{\sum_{i=0}^Ne_ip_i}\sum_{i=0}^Ne_i\rho_i(\omega_k,\omega_o,\alpha_k)
p=∑i=0Neipiealli=0∑Neiρi(ωk,ωo,αk)
其中
ω
o
\omega_o
ωo为由其中一个策略选择的输出方向,
e
i
e_i
ei为第i个波瓣的能量,
e
a
l
l
e_{all}
eall为总能量,
p
i
p_i
pi为对粗糙度为
α
i
\alpha_i
αi采样vNDF的概率密度函数,
r
h
o
i
rho_i
rhoi为第i个微平面模型。
6.1.2 实时模型
对于实时场景,我们重复使用前向模型,限制到2或3个波瓣,因为在所有的实时引擎中,诸如区域光和环境贴图对于GGX模型都是预积分的,我们在此内容上估算我们的模型。
6.2 对称模型
对于离线场景,光传输的对称性很重要(如BDPT或MLT),我们从前向模型建立一个特殊的对称化。我们假设入射光线和出射光线在相同的微平面上。我们进一步使用反射光线将具有相同的半程向量的属性(参考原文附录E证明)。因此可以对不同的向量 θ d \theta_d θd使用我们的方法。(感觉这部分不是特别重要,就不翻译了)
Refrences
Wenzel Jakob, Eugene D’Eon, Otto Jakob, and Steve Marschner. 2014. A comprehensive framework for rendering layered materials. ACM Transactions on Graphics 33, 4 (jul2014), 1–14. ↩︎ ↩︎
Andrea Weidlich and Alexander Wilkie. 2007. Arbitrarily Layered Micro-facet Surfaces. In ACM GRAPHITE. 171–178. ↩︎
Sebastien Lagarde and Charles De Rousiers. 2014. Moving Frostbite to PBR. In Physically Based Shading Theory Practice - SIGGRAPH Courses. ↩︎
Christopher Kulla and Alejandro Conty. 2017. Revisiting Physically Based Shading at Imageworks. In SIGGRAPH Course, Physically Based Shading. ↩︎
Matt Pharr and Greg Humphreys. 2010.Physically Based Rendering, Second Edition:From Theory To Implementation(2nd ed.). Morgan Kaufmann Publishers Inc. ↩︎
Laurent Belcour, Kavita Bala, and Cyril Soler. 2014. A local frequency analysis of light scattering and absorption. ACM Transactions on Graphics 33, 5 (2014), 163. ↩︎