着色(shading)
光栅化阶段将图元(通常是三角形)映射到屏幕上的像素,光栅化之后进入shading阶段(shading翻译为着色并不准确,shading不仅仅是着色,还包括光照、纹理、材质等等)以WebGL为例,就是将每个像素送入片段着色器(这里片段实际就是像素)从而确定像素的最终效果。
着色模型(shading model)
Blinn-Phong Reflectance Model是一种简单的shading model,而shader的工作就是实现shading model。 Blinn-Phong Reflectance Model表示:
(1)光可以分为漫反射光、高光、环境光
(2)shading是局部的!shading是局部的!shading是局部的!shaing是对一个point而言的
(1)Diffuse Reflection
漫反射条件:
就漫反射而言,当一束光照射到一个点上时,点的漫射光是均匀沿着四面八方的,能量完全一样,因此漫反射导致的表面的光照颜色对于各个角度去看都是一样的。
光漫反射的能量:
兰伯特定律告诉我们,一个平面上的点接受光能量的多少,却决于这个点的法线与光的角度。
因此我们定义,一个shading point(与观察角度方向无关)所接受的漫反射能量为:
L
d
=
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
⋅
l
)
L_d=k_d(I/r^2)max(0,n\cdot{l})
Ld=kd(I/r2)max(0,n⋅l)其中
k
d
k_d
kd 为漫反射系数(与材质有关),
n
n
n 为法线,
l
l
l 为入射光。
(2)Specular Term
某一点 point 的高光与入射光角度、视角有关,当视角越接近镜面反射角时,高光越强。
由于比较视角与近镜面反射角之间的夹角较为困难,我们引入一个半程向量
h
h
h 的概念,半程向量定义为视角向量与近镜面反射向量的和向量的单位向量
因此高光表示为:
p
p
p 决定高光的衰减坡度,如果
p
p
p 越大,高光衰减的越快,高光点越小;如果
p
p
p 越小,高光衰减的越慢,高光点越大
(3)Ambient Term
环境光照定义为一个常量,与其他任何因素无关。
Blinn-Phong Reflectance Model 最终表示为:
L
=
L
a
+
L
d
+
L
s
L=L_a+L_d+L_s
L=La+Ld+Ls
L
=
K
a
I
a
+
k
d
(
I
/
r
2
)
m
a
x
(
0
,
n
⋅
l
)
+
k
s
(
I
/
r
2
)
m
a
x
(
0
,
n
⋅
h
)
L=K_aI_a+k_d(I/r^2)max(0,n\cdot{l})+k_s(I/r^2)max(0,n\cdot{h})
L=KaIa+kd(I/r2)max(0,n⋅l)+ks(I/r2)max(0,n⋅h)
K
d
K_d
Kd 是从表面的材质属性中获得,而不是从纹理中获取。在一些图形渲染中,漫反射系数也可以从由纹理贴图提供,纹理贴图可以包含材质属性信息。
着色频率(shading frequency)
(1)flat shading - shade each triangle
在 flat shading 中三角形的一个面只有一个法向量只有一种颜色,该法向量通过三个顶点的法向量插值求得。
(2)gouraud shading - shade each vertex
在 gouraud shading 中三角形的一个面内的颜色通过顶点的值插值求得。
(3)Phone shading - shade each pixel
在 Phone shading 中三角形的一个面内的像素法向量都由三个定点法向量插值获得。