法线分布函数
前言
上一节PBR 三介绍了从渲染方程到BRDF的三项。这章是深入介绍各个法线分布函数的模型。本章主要参考了毛星云的专栏法线分布函数相关总结,大家可以跳转过去仔细阅读。
参考资料
- Real-Time Rendering 4th Edition, Tomas et al. , CRC Press
- Physical Based Rendering: From Theory to Implementation
- 法线分布函数相关总结
- Naty Hoffman, Recent Advances in Physically Based Shading, SIGGRAPH 2016
- [Heitz 2014]Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs
从宏观表现到微观细节
法线分布函数的问世,代表了真实感图像渲染从宏观到微观的转变。图形学中,对几何体外观的建模,总会假设一定的建模尺度和观察尺度:
- 宏观尺度(Macroscale):几何体通过三角形网格进行建模, 由顶点法线(Vertex Normal)提供每顶点法线信息
- 中尺度(Mesoscale):几何体通过纹理进行建模,由法线贴图**(Normal Map)**提供每像素法线信息
- 微观尺度(Microscale):几何体通过BRDF进行建模,由粗糙度贴图**(Roughness Map)**配合法线分布函数,提供每亚像素(subpixel)法线信息
传统光照模型中,一般只到中尺度的法线贴图(Normal Map)层面。而通过将粗糙度贴图(Roughness Map)与微平面归一化的法线分布函数结合,将需渲染出来的图像细化到了微观尺度(Microscale)的亚像素层面,对材质的微观表现更加定量,所以生成的图片能更真实,其方法也能更全面的把控材质外观和质感。
D ( h ) D(h) D(h) 即法线分布函数 (Normal Distribution Function),描述了平面法线分布的概率,即具有正确朝向的微表面法线浓度。即具有正确朝向,能够将来自 l l l的光反射到 v v v的表面点的相对于表面面积的浓度。 D ( h ) D(h) D(h)常被直接写作 D ( m ) D(m) D(m)。其基本定义请见PBR 三。
最常见的法线分布函数是各向同性(isotropic)的,即各个点以宏观表面法线 n n n为轴旋转的反射光的分布是相同。常见的各项同性法线分布函数按出现时间进行排序,如下:
- Berry [1923]
- Beckmann [1963]
- Phong [1973]
- Blinn-Phong [1977]
- ABC [1989]
- GGX [2007] / Trowbridge-Reitz [1975]
- Shifted Gamma Distribution,SGD [2012]
- Trowbridge-Reitz(GTR)[2012]
- Student’s T-Distribution , STD [2017]
- Exponential Power Distribution , EPD [2017]
- …
法线分布函数的形状不变性
形状不变性(shape-invariant)是一个合格的法线分布函数需要具备的重要性质。具有形状不变性(shape-invariant)的法线分布函数,可以用于推导该函数的归一化的各向异性版本,并且可以很方便地推导出对应的遮蔽阴影项G。
若一个各向同性的NDF可以改写成以下形式,则这个NDF具有形状不变性(shape-invariant):
D
(
m
)
=
1
α
2
(
n
⋅
m
)
4
g
(
1
−
(
n
⋅
m
)
2
α
(
n
⋅
m
)
)
=
f
(
t
a
n
θ
h
α
)
α
2
c
o
s
4
θ
h
D(m)=\frac{1}{\alpha^2(n\cdot m)^4}g(\frac{\sqrt{1-(n\cdot m)^2}}{\alpha(n\cdot m)})=\frac{f(\frac{{\rm tan}\theta_h}{\alpha})}{\alpha^2{\rm cos}^4\theta_h}
D(m)=α2(n⋅m)41g(α(n⋅m)1−(n⋅m)2)=α2cos4θhf(αtanθh)
其中,
g
(
)
g()
g()或者
f
(
)
f()
f()代表一个表示了NDF形状的一维函数。
对于形状不变的NDF,缩放粗糙度参数相当于通过倒数拉伸微观几何,如下图所示。
图片来源:Naty Hoffman, Recent Advances in Physically Based Shading, SIGGRAPH 2016
为了更容易理解形状不变性,可以将NDF视为
P
22
P^{22}
P22,即一个2D斜率的分布。原始的NDF是一个3D的矢量分布。然后我们可以发现,对于具有形状不变形式的分布,线性缩放粗糙度
α
\alpha
α会导致斜率空间中的分布线性拉伸。
2D斜率的分布P22和法线分布函数的关系以及变换式可写作:
p
22
(
x
m
~
,
y
m
~
)
=
D
(
θ
h
,
α
)
c
o
s
4
θ
h
=
1
α
2
f
(
t
a
n
θ
h
α
)
p^{22}(x_{\tilde{m}},y_{\tilde{m}})=D(\theta_h, \alpha){\rm cos}^4\theta_h=\frac{1}{\alpha^2}f(\frac{{\rm tan}\theta_h}{\alpha})
p22(xm~,ym~)=D(θh,α)cos4θh=α21f(αtanθh)
关于形状不变性的好处,可以总结为:
-
方便推导出该NDF归一化的各向异性版本
-
方便推导出遮蔽阴影项 Smith G,对于所有粗糙度和各向异性有解析解或者可以通过列表形式得到(analytic or tabulated)
-
方便基于NDF或可见法线分布推导其重要性采样:对于Smith G,可用低维函数或表格处理所有粗糙度和各向异性
-
具备形状不变性的常用法线分布函数为:
- GGX
- Beckmann
- 不具备形状不变性的常用法线分布函数为:
- Phong
- Blinn-Phong
- GTR
下图显示了如何通过拉伸表面(stretching the surface)将各向同性的形状不变分布转换为各向异性分布。相反,任何具有各向异性分布的配置都可以转换回具有各向同性分布的配置。
图片来源:[Heitz 2014]Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs
通过使用这种方法,我们可以推导出Beckmann和GGX分布的各向异性形式。
各向异性NDF相关总结
各向同性(isotropic)与各向异性(anisotropic):对于平面上的某个点,以该点的法线为轴选择,其光的反射分布没有改变,则该平面是各向同性的;反之,则是各向异性的。
现实世界中,大多数材质具有各向同性的表面外观,但有些特殊材质的微观结构具有显著的各向异性(Anisotropy),从而显著影响其外观。
创建各向异性NDF的常用方法是基于现有各向同性NDF进行推导。而推导所使用的方法是通用的,可以应用于任何形状不变的(shape-invariant)各向同性NDF,这便是GGX等形状不变的NDF能更加普及的另一个原因。
如上文所述,若一个各向同性(isotropic)的NDF具备形状不变性(shape-invariant),则其可以用以下形式写出:
D
(
m
)
=
1
α
2
(
n
⋅
m
)
4
g
(
1
−
(
n
⋅
m
)
2
α
(
n
⋅
m
)
)
D(m)=\frac{1}{\alpha^2(n\cdot m)^4}g(\frac{\sqrt{1-(n\cdot m)^2}}{\alpha(n\cdot m)})
D(m)=α2(n⋅m)41g(α(n⋅m)1−(n⋅m)2)
其各向异性的(anisotropic)版本:
D
(
m
)
=
1
α
x
α
y
(
n
⋅
m
)
4
g
(
(
t
⋅
m
)
2
α
x
2
−
(
b
⋅
m
)
2
α
y
2
(
n
⋅
m
)
)
D(m)=\frac{1}{\alpha_x\alpha_y(n\cdot m)^4}g(\frac{\sqrt{\frac{(t\cdot m)^2}{\alpha^2_x}-\frac{(b\cdot m)^2}{\alpha^2_y}}}{(n\cdot m)})
D(m)=αxαy(n⋅m)41g((n⋅m)αx2(t⋅m)2−αy2(b⋅m)2)
其中,参数
α
x
\alpha_x
αx和
α
y
\alpha_y
αy分别表示沿切线(tangent)方向t和副法线(binormal)方向b的粗糙度。若
α
x
=
α
y
\alpha_x=\alpha_y
αx=αy,则上式缩减回各向同性形式。
需要注意的是,一般的shader写法,会将切线方向
t
t
t写作
X
X
X,副法线(binormal)
b
b
b方向写作
Y
Y
Y。
α
x
=
γ
2
(
1
+
k
a
n
i
s
o
)
α
y
=
γ
2
(
1
−
k
a
n
i
s
o
)
\begin{aligned}\alpha_x=\gamma^2(1+k_{aniso})\\ \alpha_y=\gamma^2(1-k_{aniso})\end{aligned}
αx=γ2(1+kaniso)αy=γ2(1−kaniso)
其他各项异性参数化方法
虽然参数化各向异性NDF的最直接的方法是使用各向同性粗糙度进行两次参数化,
α
x
\alpha_x
αx和
α
y
\alpha_y
αy,有时也使用其他参数化。 在迪士尼原理着色模型中,各向同性粗糙度参数
γ
\gamma
γ与第二标量参数
k
a
n
i
s
o
k_{aniso}
kaniso组合,范围为
[
0
,
1
]
[0,1]
[0,1]。 从这些参数计算
α
x
\alpha_x
αx和
α
y
\alpha_y
αy的值:
k
a
s
p
e
c
t
=
1
−
0.9
k
a
n
i
s
o
α
x
=
γ
2
k
a
s
p
e
c
t
α
y
=
γ
2
k
a
s
p
e
c
t
\begin{aligned}k_{aspect}&=\sqrt{1-0.9k_{aniso}}\\ \alpha_x &=\frac{\gamma^2}{k_{aspect}}\\ \alpha_y &=\gamma^2k_{aspect}\end{aligned}
kaspectαxαy=1−0.9kaniso=kaspectγ2=γ2kaspect
其中,上式中的因子
0.9
0.9
0.9将纵横比限制为
10
:
1
10:1
10:1。
Sony Imageworks 则使用了一种不同的参数化,允许任意程度的各向异性:
常见的NDF
Beckmann–Spizzichino model,1963
基于微平面斜率(microfacet slope)的高斯分布的一个模型,具备形状不变性(shape-invariant),归一化后的函数为:
D
(
m
)
=
1
π
α
2
c
o
s
4
θ
h
e
x
p
(
−
t
a
n
2
θ
h
α
2
)
=
1
π
α
2
(
n
⋅
m
)
4
e
x
p
(
(
n
⋅
m
)
2
−
1
α
2
(
n
⋅
m
)
2
)
D(m)=\frac{1} {\pi\alpha^2{\rm cos}^4\theta_h}{\rm exp}(-\frac{{\rm tan}^2\theta_h}{\alpha^2})= \frac{1}{\pi\alpha^2(n\cdot m)^4}{\rm exp}({\frac{(n\cdot m)^2-1}{\alpha^2(n\cdot m)^2}})
D(m)=πα2cos4θh1exp(−α2tan2θh)=πα2(n⋅m)41exp(α2(n⋅m)2(n⋅m)2−1)
当
σ
\sigma
σ是RMS slope时,
α
=
2
σ
\alpha=\sqrt 2\sigma
α=2σ。其中,
α
\alpha
α时表面的粗糙度。Beckmann–Spizzichino model也是Cook-Torrance BRDF在提出时选择的NDF[Cook 1981] [Cook 1982]。
其对应的各向异性的分布函数为:
D
(
m
)
=
1
π
α
x
α
y
c
o
s
4
θ
h
e
x
p
[
−
t
a
n
2
θ
h
(
c
o
s
2
ϕ
h
α
x
2
+
s
i
n
2
ϕ
h
α
y
2
)
]
D(m)=\frac{1} {\pi\alpha_x\alpha_y{\rm cos}^4\theta_h}{\rm exp}[-{\rm tan}^2\theta_h(\frac{{\rm cos}^2\phi_h}{\alpha^2_x}+\frac{{\rm sin}^2\phi_h}{\alpha^2_y})]
D(m)=παxαycos4θh1exp[−tan2θh(αx2cos2ϕh+αy2sin2ϕh)]
上述公式中,若
α
x
=
α
y
\alpha_x=\alpha_y
αx=αy时,就是各向同性的Beckmann–Spizzichino model。
Blinn-Phong分布
Blinn-Phong分布的前身Phong分布是计算机图形学文献中提出的最早的着色方程之一。
Blinn-Phong法线分布函数由Blinn推导出,作为(非基于物理的)Phong着色模型的改进,以更好地拟合微平面BRDF的结构。
Blinn-Phong 分布不具备形状不变性(shape-invariant)。
虽然Blinn在提出Blinn-Phong分布时没有指定归一化因子,但很容易计算,关于Blinn-Phong的归一化的讨论,可以参见http://www.thetenthplanet.de/archives/255。下式是较为主流的归一化的Blinn-Phong(Normalized Blinn-Phong)的形式:
D
(
m
)
=
α
p
+
2
2
π
(
n
⋅
m
)
α
p
D(m)=\frac{\alpha_p+2}{2\pi}(n\cdot m)^{\alpha_p}
D(m)=2παp+2(n⋅m)αp
其中,
α
p
\alpha_p
αp时Blinn-Phong NDF的粗糙度参数。在实际操作中,常通过非线性函数将该参数线性化,如
α
p
=
m
s
\alpha_p=ms
αp=ms,其中
s
∈
[
0
,
1
]
s\in[0,1]
s∈[0,1],可以让美术师进行调节,而
m
m
m则可以设定一个上下界限。
UE4中,则采用
α
p
=
2
α
−
2
−
2
\alpha_p=2\alpha^{-2}-2
αp=2α−2−2 , 那么得到的Blinn-Phong的形式为:
D
(
m
)
=
1
π
α
2
(
n
⋅
m
)
2
α
2
−
2
D(m)=\frac{1}{\pi\alpha^2}(n\cdot m)^{\frac{2}{\alpha^2}-2}
D(m)=πα21(n⋅m)α22−2
GGX(Trowbridge-Reitz)分布
GGX即Trowbridge-Reitz分布,最初由Trowbridge和Reitz [Trowbridge 1975]推导出,在Blinn 1977年的论文 [Blinn 1977]中也有推荐此分布函数,但一直没有受到图形学界的太多关注。30多年后,Trowbridge-Reitz分布被Walter等人独立重新发现[Walter 2007],并将其命名为GGX分布。之后,GGX分布采用风潮开始在电影 [Burley 2012]和游戏 [Karis 2013][Lagarde 2014]行业中广泛传播,成为了如今游戏行业和电影行业中最常用的法线分布函数。
GGX分布的公式为:
D
(
m
)
=
α
2
π
[
(
n
⋅
m
)
2
(
α
2
−
1
)
+
1
]
2
D(m)=\frac{\alpha^2}{\pi[(n\cdot m)^2(\alpha^2-1)+1]^2}
D(m)=π[(n⋅m)2(α2−1)+1]2α2
对比Beckmann–Spizzichino模型,Trowbridge and Reitz模型具有更高的尾巴,也就是说对于远离法线的方向来说它会更慢的趋近与零,如下图所示。
图片来源:Physically Based Rendering, Section 8.4
在流行的模型中,GGX拥有最长的尾部,这是GGX能够日益普及的主要原因。

GGX分布具备形状不变性(shape-invariant),而与其对标的GTR等分布不具备形状不变性,这是GGX能普及的深层次原因。
在迪士尼原理着色模型(Disney principled shading model)中,Burley推荐将粗糙度控制函数: α = r 2 \alpha= r^2 α=r2,其中 r r r是0到1之间的平面粗糙度参数值,以让分布以更线性的方式进行操控。这种方式实用性较好,不少使用GGX分布的引擎与游戏都采用了这种映射,如UE4和Unity。
GGX各向异性分布公式为:
D
(
w
h
)
=
1
π
α
x
α
y
c
o
s
4
θ
h
[
1
+
t
a
n
2
θ
h
(
c
o
s
2
ϕ
h
/
α
x
2
+
sin
2
ϕ
h
/
α
y
2
)
]
2
D(w_h)=\frac{1}{\pi\alpha_x\alpha_y{\rm cos}^4\theta_h[1+{\rm tan}^2\theta_h({\rm cos}^2\phi_h/\alpha^2_x+\sin^2\phi_h/\alpha^2_y)]^2}
D(wh)=παxαycos4θh[1+tan2θh(cos2ϕh/αx2+sin2ϕh/αy2)]21
Generalized-Trowbridge-Reitz(GTR)分布
Burley [ Burley 2012]根据对Berry,GGX等分布的观察,提出了广义的Trowbridge-Reitz(Generalized-Trowbridge-Reitz,GTR)法线分布函数,其目标是允许更多地控制NDF的形状,特别是分布的尾部:
D
(
m
)
=
c
[
1
+
(
n
⋅
m
)
2
(
α
2
−
1
)
]
γ
D(m)=\frac{c}{[1+(n\cdot m)^2(\alpha^2-1)]^\gamma}
D(m)=[1+(n⋅m)2(α2−1)]γc
其中,KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲参数用于控制尾部形状。 当KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲=2时,GTR等同于GGX。 随着KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲的值减小,分布的尾部变得更长;而随着KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲值的增加,分布的尾部变得更短。
- KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲=1时,GTR即Berry分布
- KaTeX parse error: Undefined control sequence: \gama at position 1: \̲g̲a̲m̲a̲=2时,GTR即GGX(Trowbridge-Reitz)分布
以下为各种γ值的GTR分布曲线与θh的关系图示:
图片来源:Figure 18, Brent Burley, Recent Advances in Physically Based Shading, SIGGRAPH 2012
GTR分布不具备形状不变性(shape-invariant),导致其发布以来,无法被广泛使用。
其他分布
2017年以来新发布的学生T-分布(Student’s T-Distribution , STD) [ Ribardière 2017]和指数幂分布(exponential power distribution ,EPD)[ Holzschuch 2017] NDF包括形状控制参数。两者都具有形状不变性,但由于发布时间较新,实用性尚不明朗,目前很少有听说有实际使用。
NDF的性能优化
Blinn-Phong不一定比GGX更省性能
需要注意的是,Normalized Blinn-Phong不一定比GGX更省,要具体看GPU架构。让我们从指令数对两者的计算量进行量化。两者的计算Shader代码如下:
// [Blinn 1977, "Models of light reflection for computer synthesized pictures"]
float D_Blinn( float a2, float NoH )
{
float n = 2 / a2 - 2;
return (n+2) / (2*PI) * PhongShadingPow( NoH, n ); // 1 mad, 1 exp, 1 mul, 1 log
}
// GGX / Trowbridge-Reitz
// [Walter et al. 2007, "Microfacet models for refraction through rough surfaces"]
float D_GGX( float a2, float NoH )
{
float d = ( NoH * a2 - NoH ) * NoH + 1; // 2 mad
return a2 / ( PI*d*d ); // 4 mul, 1 rcp
}
若统计一下两种分布函数的计算指令,可以得到:
标准的GGX计算指令为两次mad,4次mul,一次rcp。共7次运算。
标准的Blinn-Phong计算指令为1次mad, 1次exp, 1次mul, 1次log。共4次运算。
不难发现,Blinn-Phong虽然比GGX的总运算次数少3次,但具有exp、log等稍复杂的运算。两者
的性能差异主要还是要看GPU架构,对某些架构的GPU而言, GGX可能会更快。
GGX分布的移动端性能优化
标准的GGX的公式和一般Shader实现如下:
D
(
m
)
=
α
2
π
[
(
n
⋅
m
)
2
(
α
2
−
1
)
+
1
]
2
D(m)=\frac{\alpha^2}{\pi[(n\cdot m)^2(\alpha^2-1)+1]^2}
D(m)=π[(n⋅m)2(α2−1)+1]2α2
// GGX / Trowbridge-Reitz
// [Walter et al. 2007, "Microfacet models for refraction through rough surfaces"]
float D_GGX( float a2, float NoH )
{
float d = ( NoH * a2 - NoH ) * NoH + 1; // 2 mad
return a2 / ( PI*d*d ); // 4 mul, 1 rcp
}
在上述实现中,用float进行数据的存储与计算。其实我们可以通过使用半精度浮点数(half precision floats)来对此实现进行改进。这种优化需要改变原始方程,因为在半浮点数half(即mediump)中计算 1 − ( n ⋅ m ) 2 1-(n\cdot m)^2 1−(n⋅m)2时存在两个问题:
- 当 1 − ( n ⋅ m ) 2 1-(n\cdot m)^2 1−(n⋅m)2接近1时(即高亮部分),(n\cdot m)^2的计算会出现浮点数取消(floating point cancellation)现象,关于此现象,具体可以参考https://en.wikipedia.org/wiki/Floating_point#Addition_and_subtraction 和https://scicomp.stackexchange.com/questions/5253/cancellation-problem-in-float-point-numbers
-
n
⋅
m
n\cdot m
n⋅m在
1.0
1.0
1.0左右没有足够的精度。可以通过拉格朗日恒等式(Lagrange’s identity)解决此问题,格朗日恒等式即:
∣ a × b ∣ 2 = ∣ a ∣ 2 ∣ b ∣ 2 − ( a ⋅ b ) 2 |a\times b|^2=|a|^2|b|^2-(a\cdot b)^2 ∣a×b∣2=∣a∣2∣b∣2−(a⋅b)2
由于 n n n和 h h h都是单位矢量,那么 ∣ n × m ∣ 2 = 1 − ( n ⋅ m ) 2 |n\times m|^2=1-(n\cdot m)^2 ∣n×m∣2=1−(n⋅m)2。
于是,我们可以通过使用简单的叉积 ∣ n × m ∣ 2 |n\times m|^2 ∣n×m∣2来直接计算半精度浮点数下的 1 − ( n ⋅ m ) 2 1-(n\cdot m)^2 1−(n⋅m)2。
总的来说,此优化方案会带来更好的性能,并保持所有计算都在half(mediump)内进行。
UE4对GGX的移动端优化的Shader实现代码如下:
#ifndef MOBILE_GGX_USE_FP16
#define MOBILE_GGX_USE_FP16 1
#endif
#define MEDIUMP_FLT_MAX 65504.0
#define MEDIUMP_FLT_MIN 0.00006103515625
#if MOBILE_GGX_USE_FP16
#define saturateMediump(x) min(x, MEDIUMP_FLT_MAX)
#else
#define saturateMediump(x) (x)
#endif
half GGX_Mobile(half Roughness, half NoH, half3 H, half3 N)
{
#if MOBILE_GGX_USE_FP16
float3 NxH = cross(N, H);
float OneMinusNoHSqr = dot(NxH, NxH);
#else
float OneMinusNoHSqr = 1.0 - NoH * NoH;
#endif
half a = Roughness * Roughness;
float n = NoH * a;
float p = a / (OneMinusNoHSqr + n * n);
float d = p * p;
return saturateMediump(d);
}
更多关于NDF性能优化的讨论,由于篇幅原因,这边就不一一展开了。
其他的法线分布函数优化相关的材料供大家参考:
http://filmicworlds.com/blog/optimizing-ggx-shaders-with-dotlh/
http://filmicworlds.com/blog/optimizing-ggx-update/
SIGGRAPH 2015,Optimizing PBR for Mobile,Renaldas Zioma
多高光波瓣(multiple specular lobes)
即便是GGX的高光长尾,仍然不足以媲美真实世界材质中的高光表现。在不增加NDF本身的复杂性的前提下,更好地匹配测量材质的替代解决方案是使用多个高光波瓣(multiple specular lobes)。
- Cook 和Torrance [Cook Torrance1981]首先提出了这个想法。之后 [Ngan 2005]进行了实验测试,他发现对于大部分材质来说,添加第二个高光波瓣确实显着改善了贴合性。
- 皮克斯PxrSurface材质具有“粗糙镜面反射(rough specular)”波瓣,旨在用于此目的(与主镜面波瓣一起使用)。附加波瓣是一个完整的镜面微平面BRDF,包含所有相关的参数与项。
- Sony Imageworks使用更外部的方法,使用两个GGX NDF的混合作为扩展的NDF暴露给用户,而不是整个单独的镜面BRDF项。在这种情况下,所需的唯一附加参数是第二粗糙度值和混合量。
- Disney Principled BRDF也使用了两个固定的高光波瓣(specular lobe),且都使用GTR分布。 主波瓣(primary lobe)使用 γ = 2 \gamma=2 γ=2的GTR(即GGX分布),代表基础底层材质(Base Material)的反射,可为各项异性(anisotropic)或各项同性(isotropic)的金属或非金属。次级波瓣(secondary lobe)使用 γ \gamma γ的GTR(即Berry分布),代表基础材质上的清漆层(ClearCoat Layer)的反射,一般为各项同性(isotropic)的非金属材质,即清漆层(ClearCoat Layer)
另外,多高光波瓣(multiple specular lobes)常与Layered mixture model结合使用。
离线渲染器的多层混合建模(Layered mixture model)
图片来源:Autodesk Standard Surface
Autodesk Standard Surface多层建模的multiple specular lobes材质。整体框架为“原子”闭包的加权和,每个闭包的重量是沿着从其相应叶节点到根节点的路径的边缘重量的乘积。shader参数权重以粗体显示。
图片来源:Autodesk Standard Surface
通过组合clearcoat层和标准层的多高光波瓣(multiple specular lobes)架构,可以实现各种效果。 从左到右:铝花(flakes),表面水滴(raindrops),碳纤维(carbon fiber)
图片来源:Arnold Renderer
PBR中的高光抗锯齿
锯齿(Aliasing)是实时渲染和图形学中经常会面对的问题。而PBR由于使用了标准化的法线分布函数(normalized NDF),以及无处不在的反射现象,加上实时渲染中较少的采样率,让其高光的锯齿问题更加明显。这导致了基于物理的渲染中,高光锯齿是实践中经常会遇到的问题。
- 模型精度越高、工作流越倾向于全PBR方式、光照计算精确程度越高,则反射的高光锯齿问题就越明显。
以下是带高光锯齿的PBR渲染图和经过TAA处理锯齿后的对比图:
PBR赛车渲染(未经过抗锯齿处理)
图片来源:CTAA , Unity AssetStore
PBR赛车渲染(基于TAA(Temporal Anti-Aliasing,时域抗锯齿)处理)
图片来源:CTAA , Unity AssetStore
出现高光锯齿的原因可以总结为: 法线分布函数作为亚像素表面结构(subpixel surface structure)的统计描述。 当相机和表面之间的距离增加时,先前覆盖多个像素的表面结构会减小到亚像素(subpixel)大小,从而从法线贴图的领域移动到法线分布函数的亚像素领域。在亚像素领域,纹理的mipmap一般以平均的方式进行处理,会丢失原有的细节,从而让该像素处的法线分布过于狭窄和集中,于是便会出现高光在像素级别的不连续性,以闪烁高光(flickering highlights)形式引起锯齿。
关于高光锯齿,业界的解决方案分为两大流派:屏幕空间抗锯齿(Anti-Aliasing)和预过滤(Pre-Filtering),下面分别进行总结:
- 屏幕空间抗锯齿(Anti-Aliasing)。 MSAA(MultiSample Anti-Aliasing,多采样抗锯齿),SSAA(SuperSample Anti-Aliasing,超采样抗锯齿), FXAA(Fast Approximate Anti-Aliasing,快速近似抗锯齿)和TAA(Temporal Anti-Aliasing,时域抗锯齿)等抗锯齿技术可以求解单像素上多个点的入射光,找出其中小的变化点,从而减少可见的锯齿。其中目前较为有效的PBR高光抗锯齿的技术,当属TAA(Temporal Anti-Aliasing,时域抗锯齿)。有关TAA技术的更多详细信息,可以参考UE4在SIGGPRACH 2014中的分享
- 预过滤(Pre-Filtering)。 类似Toksvig,LEAN Mapping、CLEAN Mapping和LEADR Mapping等技术方案,按照像素覆盖区域,将宏观几何(macro- geometric)(曲率)和中观几何(meso-geometric)(法线贴图,位移贴图)的变化,转移到材质属性的微观几何变化,来保持采样数量较少。这种变换可以更容易和更快地求解像素覆盖区域内发生的所有交互。其中,Toksvig和LEAN Mapping专注于法线贴图的过滤,LEAN映射的简单变体CLEAN Mapping需要较少的存储,代价是失去各向异性支持,而LEADR Mapping则用于位移贴图的过滤。而其他技术则通过将曲率转换为材质属性来近似宏观的几何过滤。Stephen Hill的blog文章对此内方案进行了结合改进;一个对应的WebGL实现demo
主流NDF的局限性和发展趋势
当前主流NDF的局限性可以主要总结为如下三点:
- 缺少更好的形状控制NDF
- 无法表示粗粒度微观结构
- 单次散射建模的局限性
缺少更好的形状控制NDF
现有的主流NDF缺少更好的形状不变性(Shape Invariance)+形状控制(Shape Control)的结合。对此,Naty Hoffman在SIGGRAPH 2016上提出,广义Beckmann分布(Generalized Beckmann)和超柯西分布(Hyper-Cauchy)可以作为实践中的选择。
现有NDF无法表示粗粒度微观结构
当今使用的NDF从外观而言都很平滑,如下图中左边的NDF。这种NDF每个像素覆盖了数万个表面细节。
细粒度的NDF vs 粗粒度的NDF
图片来源:“Rendering Glints on High-Resolution Normal-Mapped Specular Surfaces”, Yan et al., SIGGRAPH 2014
但其实真实世界中的许多表面材质,具有粗粒度的微观结构,像素仅覆盖了几十个表面元素。 在这种情况下,法线分布的表现更像是如上图的右边所示,表面有一个复杂而闪烁外观,而不仅仅的各项异性这么简单。目前提出的模型都无法表示出这种类型的法线分布。期待未来有更多能解决此问题的法线分布函数的问世。
单次散射建模的局限性和发展趋势
目前实时渲染领域广泛采用的microfacet BRDF微平面模型,实际上是人们可以想到的最简单的模型,它仅对几何光学系统中的单层微表面上的单次散射进行建模。没有考虑多次散射,没有考虑衍射,也没有考虑波动光学。其假设所有遮挡的光线都被丢失,会导致与现实行为相比的能量损失。下图描述几何光学与物理光学的不同。
图片来源:Naty Hoffman, Recent Advances in Physically Based Shading, SIGGRAPH 2016
对此,一些论文提出,可以采用非基于物理的修正因子(corrective factors)来尝试对缺失的能量进行补偿。例如迪士尼模型中的的“Sheen”光泽项。
另外,近年不少渲染器也开始结合multiple-scattering BSDF使用多次散射进行建模,如cycles renderer的 Multiscatter GGX。但目前的multiple-scattering BSDF方案主要为随机求解,所以不适用于实时渲染和游戏领域。
粗糙漫反射和粗糙电介质为表面的multiple-scattering BSDF效果图
图片来源:Multiple-Scattering Microfacet BSDFs with the Smith Model,Eric Heitz, Johannes Hanika, Eugene d’Eon and Carsten Dachsbacher, ACM SIGGRAPH 2016
虽然Multiscatter GGX等方案离实时渲染还有很长一段路。
Multiple-Scattering Microfacet BSDF
Multiple-Scattering Microfacet BSDFs with the Smith Model
Symmetric GGX (SGGX)
The SGGX Microflake Distribution