一、何为Shading?
在Games101中是这样解释的:
The process of applying a material to an object.
也就是说,Shading在计算机图形学中,指的是将材质应用到物体上的过程,因此Shading就是“着色”的意思。
接下来,将介绍一些基础的着色模型
二、朗伯着色模型(Lambertian Shading)
这是一个在18世纪由科学家朗伯(Johann Heinrich Lambert,1728~1777)提出的模型,大致内容为: the amount of energy from a light source that falls on an area of
surface depends on the angle of the surface to the light.(物体表面来自一个光源的能量取决于该表面与光线的夹角),这表明:
- 物体表面正对着光线,光照强度最大
- 物体表面与光线方向相切(或背对),光照强度为零
- 在以上两种情况之间,光照强度与表面法线和光线之间夹角余弦成正比
这就得到了朗伯着色模型,也称为朗伯余弦定理
L
=
k
d
I
m
a
x
(
0
,
n
^
⋅
l
^
)
L=k_dImax(0,\hat{n}\cdot\hat{l} )
L=kdImax(0,n^⋅l^)
其中L代表像素的颜色
k
d
k_d
kd
代表扩散系数(diffuse coefficient),或表面颜色
I
I
I
代表光源的光照强度
向量n表示表面的法线方向,向量l表示光线方向,由于这里二者均为单位向量,则二者的点积就是法线方向与光线方向的夹角余弦值。示意图如下所示:
需要注意的是,这个模型只能对像素单个分量进行计算,例如: the red component of the pixel value is the product of the red diffuse component, the red light source intensity, and the dot product; the same holds for green and blue.(像素值的红色分量为红色漫射分量与红色光源强度、点积的乘积;绿色和蓝色也是如此。)
三、布林冯着色模型(Blinn-Phong Shading)
在使用朗伯着色模型时,我们发现了这样的问题:
Lambertian shading is view independent: the color of a surface does not depend
on the direction from which you look. Many real surfaces show some degree
of shininess, producing highlights, or specular reflections, that appear to move
around as the viewpoint changes. Lambertian shading doesn’t produce any highlights and leads to a very matte, chalky appearance, and many shading models add a specular component to Lambertian shading; the Lambertian part is then the diffuse component.
大意就是说如果使用朗伯着色模型着色时发现物体表面颜色并不取决于你的观察视角,比如表面的质感像高光或者镜面反射并不像现实中随着你看的角度变化而变化。这就导致了物体看起来具有磨砂和白垩岩的质感。
而布林冯着色模型就解决了这样的问题,它是由Phong(Phong,1975)提出,后来被Blinn(J.F.Blinn,1975)修缮的模型,至今仍然有着广泛地应用,它的做法是:
The idea is to produce reflection that is at its brightest when v and l are symmetrically positioned across the surface normal, which is when mirror reflection would occur; the reflection then decreases smoothly as the
vectors move away from a mirror configuration.
也就是产生一个高光点,然后通过平滑地减小高光点的镜面反射值计算出高光点周围的镜面反射值。
接下来具体介绍一下布林冯模型的细节,如下图所示:
我们引入了一个新的单位向量h,其方向为观测方向v和光线方向l夹角的角平分线方向。我们称h为半程向量(half vector),通过计算半程向量和物体表面法向量的夹角,我们可以计算高光效果的强度大小,然后通过一个大于1的指数p来计算高光周围的高光衰减效果。这样我们就可以得到修正后具有镜面(或者高光)效果的着色模型:
L
=
k
d
I
m
a
x
(
0
,
n
^
⋅
l
^
)
+
k
s
I
m
a
x
(
0
,
n
^
⋅
h
^
)
p
L=k_dImax(0,\hat{n}\cdot\hat{l} )+k_sImax(0,\hat{n}\cdot\hat{h})^p
L=kdImax(0,n^⋅l^)+ksImax(0,n^⋅h^)p
其中
h
^
=
v
^
+
l
^
∣
∣
v
^
+
l
^
∣
∣
\hat{h}=\frac{\hat{v}+\hat{l}} {||\hat{v}+\hat{l}||}
h^=∣∣v^+l^∣∣v^+l^
并且其中
k
s
k_s
ks表示镜面反射系数,或物体表面的镜面颜色(?
以下是不同数量级指数p能产生的效果:
(这个英文简单,就不翻译了捏[\吐舌])
三、环境光着色模型(Ambient Shading)
如果物体没有接收到任何光照,那么它将会是完全黑色的样貌,所以为了解决这样的物体,一种简单粗暴的方式是给物体的着色模型加上一个常量,这个常量并不依赖于物体表面几何关系。这就是环境光着色,就像是现实中物体被环境中来自各处的光线所照亮。
环境光通常被定义为物体表面颜色与环境光颜色对应值的乘积,可以表示为以下形式:
L
=
k
a
I
a
L=k_aI_a
L=kaIa
其中
k
a
k_a
ka表示环境光系数,或者是“环境光颜色”
I
a
I_a
Ia则表示环境光光照强度。
四、着色模型的一般形式
现代的着色模型,或者说光照模型最一般,最广泛的形式,就是环境光、漫反射和镜面光三种光照模型的结合,也就是如下形式:
L
=
k
a
I
a
+
k
d
I
m
a
x
(
0
,
n
^
⋅
l
^
)
+
k
s
I
m
a
x
(
0
,
n
^
⋅
h
^
)
p
L=k_aI_a+k_dImax(0,\hat{n}\cdot\hat{l} )+k_sImax(0,\hat{n}\cdot\hat{h})^p
L=kaIa+kdImax(0,n^⋅l^)+ksImax(0,n^⋅h^)p
推广到N个点光源,就是如下形式:
L
=
k
a
I
a
+
∑
i
=
1
N
[
k
d
I
m
a
x
(
0
,
n
^
⋅
l
^
)
+
k
s
I
m
a
x
(
0
,
n
^
⋅
h
^
)
p
]
L=k_aI_a+\sum_{i=1}^{N} [k_dImax(0,\hat{n}\cdot\hat{l} )+k_sImax(0,\hat{n}\cdot\hat{h})^p]
L=kaIa+i=1∑N[kdImax(0,n^⋅l^)+ksImax(0,n^⋅h^)p]
图源:《Fundamentals of Computer Graphics 4th Edition》