PBR即为基于物理的光照、材质和摄像机。这里只讨论材质以及unity里如何实现基于PBR的BRDF。
这里提一下BRDF,意指反射函数。由于人眼看到物体都是通过反射光,所以BRDF就实际上表现了一个物体的材质。
一个BRDF的基本组成部分为漫反射(diffuse),大部分还要加上环境光(ambient)+ 高光反射(specular),还有可能会有自发光(emissve)、此表面散射等等。
BRDF可大概的分为基于经验模型和基于真实物理(还有测量模型之类的不讨论)。
经验模式主要为
lambert漫反射
C
d
i
f
f
u
s
e
=
(
c
l
i
g
h
t
⋅
m
d
i
f
f
u
s
e
)
max
(
0
,
n
^
⋅
l
^
)
,
C_{diffuse} = (c_{light} cdot m_{diffuse})max(0,hat{n} cdot hat{l}),
Cdiffuse=(clight⋅mdiffuse)max(0,n^⋅l^),
其中c为光源颜色,m为漫反射颜色,n为表面法线,l是指向光源的单位矢量。
高光反射
主要分为 Phone 和 Blinn-Phone ,后者使用半角向量避免计算反射向量,要比前者省大概1/3的性能。
Phone高光模型为
C
s
p
e
c
u
l
a
r
=
(
c
l
i
g
h
t
⋅
m
s
p
e
c
u
l
a
r
)
max
(
0
,
v
^
⋅
r
^
)
m
g
l
o
s
s
,
C_{specular} = (c_{light} cdot m_{specular})max(0,hat{v} cdot hat{r})^{m_{gloss}},
Cspecular=(clight⋅mspecular)max(0,v^⋅r^)mgloss,
其中v为视线方向的单位矢量,r为反射反射矢量。r可由如下公式计算得到:
r
^
=
2
(
n
^
⋅
l
^
)
n
^
−
l
^
,
hat r= 2(hat n cdot hat l)hat n - hat l,
r^=2(n^⋅l^)n^−l^,
与上面的 Phone 模型相比,Blinn 提出了一个更节省计算性能的公式,引入一个新的向量h,避免计算反射向量 r。Blinn-Phone 高光模型如下所示:
C
s
p
e
c
u
l
a
r
=
(
c
l
i
g
h
t
⋅
m
s
p
e
c
u
l
a
r
)
max
(
0
,
n
^
⋅
h
^
)
m
g
l
o
s
s
,
C_{specular} = (c_{light} cdot m_{specular})max(0,hat{n} cdot hat{h})^{m_{gloss}},
Cspecular=(clight⋅mspecular)max(0,n^⋅h^)mgloss,
其中h为半角向量,可由如下公式计算:
h
^
=
v
^
+
l
^
∣
v
^
+
l
^
∣
,
hat h = frac{hat v + hat l}{begin{vmatrix} hat v + hat l end{vmatrix}},
h^=∣∣v^+l^∣∣v^+l^,
若加上漫反射和环境光,则可得
I
P
h
o
n
e
=
k
a
I
a
+
k
d
(
n
⋅
l
)
I
d
+
k
s
(
r
⋅
v
)
α
I
s
,
I_{Phone} = k_aI_a + k_d(ncdot l)I_d + k_s(rcdot v)^alpha Is,
IPhone=kaIa+kd(n⋅l)Id+ks(r⋅v)αIs,
I
B
l
i
n
n
−
P
h
o
n
e
=
k
a
I
a
+
k
d
(
n
⋅
l
)
I
d
+
k
s
(
n
⋅
h
)
α
I
s
,
I_{Blinn-Phone} = k_aI_a + k_d(ncdot l)I_d + k_s(ncdot h)^alpha Is,
IBlinn−Phone=kaIa+kd(n⋅l)Id+ks(n⋅h)αIs,
以上为均为基于经验的光照模型,接下来来看基于物理的光照模型。
1967年Torrance-Sparrow使用辐射度量学和微表面理论推导出粗糙表面的高光反射模型,1981年Cook-Torrance把这个模型引入到计算机图形学领域,现在无论是CG电影,还是3D游戏,基于物理着色都是使用的这个模型。
首先基于物理的反射方程为
L
o
(
v
)
=
∫
Ω
f
(
l
,
v
)
L
i
(
l
)
(
n
⋅
l
)
d
w
i
L_o(v) = int_Omega f(l,v)L_i(l)(n cdot l)dw_i,
Lo(v)=∫Ωf(l,v)Li(l)(n⋅l)dwi
其中,v为视线单位向量,此方向上的出射辐射率为Lo,是入射辐射率对半球的积分乘以它的 BRDF 函数 f(l, v)。
在Unity3D里,给定场景里的一个精确光源,上式可变成
L o ( v ) = π f ( l c , v ) × c l i g h t ( n ⋅ l c ) L_o(v) = pi f(l_c,v) times c_{light} (n cdot l_c), Lo(v)=πf(lc,v)×clight(n⋅lc)
若场景里包含多个精确光源,则分别代入上式并将结果相加即可。
其中函数 f 即为BRDF,Clight 为光源颜色,lc为光源方向。
在Unity3D引擎里,PBR的 BRDF 同样可分为漫反射项加高光项,即可写成(*注:此处不考虑某些特殊光照模型,且仅针对于局部光照)
f
(
l
,
v
)
=
f
d
i
f
f
+
f
s
p
e
c
f(l,v) = f_{diff} + f_{spec}
f(l,v)=fdiff+fspec
在说Unity3D中使用的漫反射函数之前,先说明上面所说的 lambert 模型是使用最为广泛的漫反射 BRDF,不过准确的 Lambertian BRDF 表示如下:
f
L
a
m
b
e
r
t
(
l
,
v
)
=
c
d
i
f
f
π
f_{Lambert}(l,v) = frac{c_{diff}}{pi}
fLambert(l,v)=πcdiff
其中,c 为漫反射光线所占的比例,通常被视为漫反射颜色。在PBR的BRDF里使用辐射度量学来表示光的入射和反射。若入射辐照率为 Li ,则在表面某点的出射漫反射辐射率为:
L
d
i
f
f
=
c
d
i
f
f
π
×
L
i
(
l
)
(
n
⋅
l
)
L_{diff} = frac{c_{diff}}{pi} times L_i(l)(ncdot l)
Ldiff=πcdiff×Li(l)(n⋅l)
可以看出,与 lambert 光照模型相当相似,区别在于 k 的取值。考虑到次表面散射,很多基于物理的渲染会使用更为复杂的漫反射模型。
在 unity 中使用的是 Disney 的 BRDF[2] 里的漫反射项:
f
d
i
f
f
(
l
,
v
)
=
b
a
s
e
C
o
l
o
r
π
⋅
k
d
f_{diff}(l,v) = frac{baseColor}{pi} cdot k_d
fdiff(l,v)=πbaseColor⋅kd
其中 k 为
k
d
=
(
1
+
(
F
D
90
−
1
)
(
1
−
n
⋅
l
)
5
)
(
1
+
(
F
D
90
−
1
)
(
1
−
n
⋅
v
)
5
)
k_d = (1 + (F_{D90} - 1)(1 - n cdot l) ^ 5)(1 + (F_{D90} - 1)(1 - n cdot v) ^ 5)
kd=(1+(FD90−1)(1−n⋅l)5)(1+(FD90−1)(1−n⋅v)5)
其中F为
F
D
90
=
0.5
+
2
r
o
u
g
h
n
e
s
s
(
h
⋅
l
)
2
F_{D90} = 0.5 + 2roughness(h cdot l) ^ 2
FD90=0.5+2roughness(h⋅l)2
其中,baseColor 是表面颜色,通常由颜色纹理采样得到, roughness 是粗糙度,通常也是由粗糙度贴图或金属性贴图采样得到。
接下来是高光反射项,PBR的高光反射基于微面元理论。
微面元理论认为,物体表面是由许多人看不到的微面元组成的,虽然物体表面不是光学平滑的,但这些微面元可以被认为是光学平滑的,即具有完美的高光反射。在考虑基于微面元的高光反射时,同样要考虑微面元之间的遮挡和菲涅尔效应。这样得到的高光反射即是基于物理的反射,不过还是有一些真实效果难以用此方法模拟,对于大部分常见的材质还是足够了。
如下是高光反射公式:
f
s
p
e
c
(
l
,
v
)
=
F
(
l
,
h
)
G
(
l
,
v
,
h
)
D
(
h
)
4
(
n
⋅
l
)
(
n
⋅
v
)
f_{spec}(l,v) = frac {F(l,h)G(l,v,h)D(h)}{4(n cdot l)(n cdot v)}
fspec(l,v)=4(n⋅l)(n⋅v)F(l,h)G(l,v,h)D(h)
其中,D 是微表面的法线分布函数,用于计算有多少比例的微面元满足 m = h,只有这部分微面元才会把光线从 l 反射到 v 上。注意 Blinn-Phone 也是一种法线分布函数。可以把 PBR 的 BRDF 看成是对经典光照模型的拓展。
G 是阴影-遮掩函数,用于计算那些满足 m = h 的微面元中有多少会由于遮挡而不会被人眼看到,因此它给出了活跃的微面元所占的浓度,只有活跃的微面元才会把光线反射到观察方向上。
F 是活跃微面元的菲涅尔反射函数,它可以告诉我们每个活跃的微面元会把多少反射光线反射到观察方向上,即反射光线占入射光线的比率。
综上所述,unity3d里 PBR 的 BRDF 公式为
f
(
l
,
v
)
=
f
d
i
f
f
+
f
s
p
e
c
=
b
a
s
e
C
o
l
o
r
π
⋅
k
d
+
F
(
l
,
h
)
G
(
l
,
v
,
h
)
D
(
h
)
4
(
n
⋅
l
)
(
n
⋅
v
)
,
f(l,v) = f_{diff} + f_{spec} = frac{baseColor}{pi} cdot k_d + frac {F(l,h)G(l,v,h)D(h)}{4(n cdot l)(n cdot v)},
f(l,v)=fdiff+fspec=πbaseColor⋅kd+4(n⋅l)(n⋅v)F(l,h)G(l,v,h)D(h),
在 Cook-Torrance 里使用的某点P的反射率方程为:
L
o
(
p
,
w
o
)
=
∫
Ω
(
c
π
⋅
k
d
+
F
(
l
,
h
)
G
(
l
,
v
,
h
)
D
(
h
)
4
(
n
⋅
l
)
(
n
⋅
v
)
)
L
i
(
p
,
w
i
)
(
w
i
⋅
n
)
d
w
i
,
L_o(p,w_o) =int_Omega ( frac {c}{pi} cdot k_d + frac {F(l,h)G(l,v,h)D(h)}{4(n cdot l)(n cdot v)} )L_i(p,w_i)(w_i cdot n)dw_i,
Lo(p,wo)=∫Ω(πc⋅kd+4(n⋅l)(n⋅v)F(l,h)G(l,v,h)D(h))Li(p,wi)(wi⋅n)dwi,
可以简单的写为:
L
o
(
p
,
w
o
)
=
∫
Ω
(
k
d
c
π
+
k
s
D
G
F
4
(
w
o
⋅
n
)
(
w
i
⋅
n
)
)
L
i
(
p
,
w
i
)
(
w
i
⋅
n
)
d
w
i
,
L_o(p,w_o) =int_Omega ( k_d frac {c}{pi} + k_s frac {DGF}{4(w_o cdot n)(w_i cdot n)} )L_i(p,w_i)(w_i cdot n)dw_i,
Lo(p,wo)=∫Ω(kdπc+ks4(wo⋅n)(wi⋅n)DGF)Li(p,wi)(wi⋅n)dwi,
⟹
Longrightarrow
⟹
输
出
颜
色
=
输出颜色 =
输出颜色=
(
漫
反
射
比
例
纹
理
颜
色
π
+
镜
面
反
射
比
例
镜
面
高
光
×
几
何
遮
蔽
×
菲
涅
尔
效
应
4
(
v
i
e
w
D
i
r
⋅
n
o
r
m
a
l
)
(
l
i
g
h
t
D
i
r
⋅
n
o
r
m
a
l
)
)
光
源
颜
色
(
l
i
g
h
t
D
i
r
⋅
n
o
r
m
a
l
)
( 漫反射比例 frac {纹理颜色}{pi} + 镜面反射比例 frac {镜面高光 times 几何遮蔽 times 菲涅尔效应}{4(viewDircdot normal)(lightDircdot normal)} )光源颜色(lightDir cdot normal)
(漫反射比例π纹理颜色+镜面反射比例4(viewDir⋅normal)(lightDir⋅normal)镜面高光×几何遮蔽×菲涅尔效应)光源颜色(lightDir⋅normal)
在unity的 UnityStandardBRDF.cginc 里实现了基于PBR的BRDF实现。



