来源:《UNITY SHADER入门精要》
文章目录
1、BRDF光照模型
BRDF模型(Bidirectional Relfectance Distribution Function,双向反射分布函数),在图形学中,BRDF大多用一个参数方程来表示,并提供一些可以调整材质属性的参数。当给定入射光线的方向和辐照度后,BRDF可以给出在某个出射方向上光照能量分布。
2、自发光和环境光
自发光和环境光都很好计算。环境光(ambient),自发光(emissive):
c
a
m
b
i
e
n
t
=
g
a
m
b
i
e
n
t
c
e
m
i
s
s
i
v
e
=
m
e
m
i
s
s
i
v
e
c_{ambient}=g_{ambient} \\ c_{emissive}=m_{emissive}
cambient=gambientcemissive=memissive
3、漫反射
①兰伯特光照模型
漫反射中,视角的位置不重要,因为反射是完全随机的,我们认为在任何反射方向上的分部都是一样的。视角的位置不重要,只有入射光线的角度很重要。
漫反射光照符合 兰伯特定律(Lambet’s law):
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
⋅
I
)
\boldsymbol{c}_{diffuse}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{diffuse} \right) \max \left( 0, n\,\,\cdot \,\,I \right)
cdiffuse=(clight⋅mdiffuse)max(0,n⋅I)
其中,n 是表面法线,I 是只想广元的单位矢量,$\boldsymbol{m}{diffuse}
,
,
,\boldsymbol{c}{light}$ 是光源颜色。需要注意的是,我们需要防止法线和光源方向点乘的结果为负值,为此,我们使用取最大值的函数来将其截取到0,这可以防止物体被从后面来的光源照亮。
②半兰伯特光照模型
相比之前的公式,多了
α
\alpha
α 和
β
\beta
β 两个参数,绝大多数情况下,这两个参数值都是 0.5。所以被称为半兰伯特光照模型。
c
d
i
f
f
u
s
e
=
(
c
l
i
g
h
t
⋅
m
d
i
f
f
u
s
e
)
(
α
(
0
,
n
^
⋅
I
)
+
β
)
\boldsymbol{c}_{diffuse}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{diffuse} \right) \left( \alpha \left( 0,\hat{n}\,\,\cdot \,\,\boldsymbol{I} \right) +\beta \right)
cdiffuse=(clight⋅mdiffuse)(α(0,n^⋅I)+β)
4、镜面反射
①冯氏模型的镜面反射计算
计算镜面反射我们需要知道的信息就比较多了,比如:表面法线
n
^
\hat{n}
n^ 、视角方向
v
^
\hat{v}
v^ 、光源方向
I
\boldsymbol{I}
I 、反射方向
r
\boldsymbol{r}
r 。
只要眼睛(摄像机)在反射光线周围都可以看得到高光,越靠近
r
^
\hat{r}
r^ 反射光照强度越大。我们可以得出一条结论:高光反射和观察角度有关。phong模型中认为,高光反射的强度与反射光线
r
^
\hat{r}
r^ 和观察角度
v
^
\hat{v}
v^ 之间夹角的余弦值成正比。
我们知道其中三个矢量,我们需要计算的是第四个矢量——反射方向。
r
=
2
(
n
^
⋅
I
)
n
^
−
I
\boldsymbol{r}=2\left( \hat{n}\cdot \boldsymbol{I} \right) \hat{n}-\boldsymbol{I}
r=2(n^⋅I)n^−I
然后,我们利用 冯氏光照模型 来计算镜面反射:
c
s
p
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
\boldsymbol{c}_{spcular}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{specular} \right) \max \left( 0, \hat{v}\,\,\cdot \,\,\boldsymbol{r} \right) ^{m_{gloss}}
cspcular=(clight⋅mspecular)max(0,v^⋅r)mgloss
其中
m
g
l
o
s
s
m_{gloss}
mgloss 是材质的光泽度(gloss),也可称为反光度(shininess),它用于控制高光区域的“亮点”。
m
g
l
o
s
s
m_{gloss}
mgloss 越大,亮点越小。
m
s
p
e
c
u
l
a
r
\boldsymbol{m}_{specular}
mspecular 是材质的高光反射颜色,用于控制材质对高光反射的强度和颜色。
c
l
i
g
h
t
\boldsymbol{c}_{light}
clight 是光源的颜色和强度。
同样,我们这里用 max()
来防止
v
^
⋅
r
\hat{v}\,\,\cdot \,\,\boldsymbol{r}
v^⋅r 为负。
②Blinn-Phong光照算法
相比Phong模型,此算法引入了一个新的矢量
h
^
\boldsymbol{\hat{h}}
h^,称之为半程向量(bisecoter)。它是对
v
^
\hat{v}
v^ 和
I
^
\hat{I}
I^取平均,然后再归一化得到:
h
^
=
v
^
+
I
∣
v
^
+
I
∣
\mathbf{\hat{h}}=\frac{\mathbf{\hat{v}}+\boldsymbol{I}}{|\mathbf{\hat{v}}+\boldsymbol{I}|}
h^=∣v^+I∣v^+I
我们不再计算
v
^
\hat{v}
v^ 和
r
^
\hat{r}
r^ 之间的夹角,转而计算
n
^
\hat{n}
n^ 和
h
^
\hat{h}
h^ 之间的夹角:
c
s
p
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
\boldsymbol{c}_{spcular}=\left( \boldsymbol{c}_{light}\cdot \boldsymbol{m}_{specular} \right) \max \left( 0,\hat{n}\,\,\cdot \,\,\hat{h} \right) ^{m_{gloss}}
cspcular=(clight⋅mspecular)max(0,n^⋅h^)mgloss
在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型,这是因为,此时可以认为
v
^
\hat{v}
v^ 和
I
I
I 都是定值,因此
h
^
\hat{h}
h^ 是一个常量。但是,
v
^
\hat{v}
v^ 当或者
I
I
I 不是定值时,Phong模型可能反而更快一些。
5、光线的计算方式
我们有两种计算方式,交给 顶点着色器 或者 片元着色器。顶点着色器中计算的过程叫做逐顶点光照(per-vertex lighting);片元着色器中计算的过程称之为逐像素光照(per-pixel lighting)。
逐顶点光照,也被称之为高洛德着色(Gouraud shading)。我们计算每个顶点上的光照,然后再渲染图元的内部进行现行差值,最后输出成像素颜色。计算量会小于逐像素点光照。但是,因为是线性插值计算,所以图元的内部颜色总是暗于顶点处的最高颜色值,有可能产生明显的棱角分明的现象。
逐像素光照,我们以每个像素为基础,得到它的法线(可以对顶点法线插值得到,也可以从法线纹理中采样得到),然后通过每个像素的法线值来计算光照。
6、Blinn-Phong模型
我们现在所采用的光照模型被称为Phong光照模型,因为是裴祥风(Bui Tuong Phong)首次使用 漫反射 和 镜面反射 来对光照进行建模。后面,由于Blinn的方法简化了计算,我们将这种模型称为Blinn-Phong光照模型。
当然,这种模型也有很多局限性。 比如,**菲涅尔反射(Fresnel reflection)无法展现出来。其次,Blinn-Phong模型是各项同性(isotropic)的,也就是说,当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但有些表面是具有各向异性(anisotropic)**反射性质的,例如拉丝金属、毛发等。