(个人笔记,由于刚开始学习再加上英语不太好,所以有的地理解的可能不太对,望指正)
Chapter 10 Surface Shading
10.1 Diffuse Shading
Lambertain Shading Model
其中n表示表面法线方向,l表示光照方向,表面颜色正比于θ,公式为
c
=
c
r
c
l
n
∙
l
(
10.1
)
c = c_rc_ln\bullet l\qquad\qquad(10.1)
c=crcln∙l(10.1)
其中
c
r
c_r
cr表示漫反射系数,
c
l
c_l
cl表示光照强度,它的取值范围为[0, 1],为了防止负值的出现将公式(10.1)表示为以下形式
c
=
c
r
c
l
m
a
x
(
0
,
n
∙
l
)
(
10.2
)
c = c_rc_lmax(0, n\bullet l)\qquad\qquad(10.2)
c=crclmax(0,n∙l)(10.2)
Ambient Shading
如果只是用漫反射公式(10.2)来表示光照效果那么会有一个问题,在光线照不到的位置会是完全黑的,添加环境光来给添加一个默认亮度
c
=
c
r
(
c
a
+
c
l
m
a
x
(
0
,
n
∙
l
)
)
(
10.3
)
c = c_r(c_a + c_lmax(0, n\bullet l))\qquad\qquad(10.3)
c=cr(ca+clmax(0,n∙l))(10.3)
其中 c a c_a ca表示所有表面接收到的环境光的平均值
10.2 Phong Shading
其中n表示法线方向,l表示光照方向,r表示反射方向,e表示观察方向。σ表示观察方向与反射方向的夹角,越大高光效果应该越弱,该影响可以表示为
c
=
c
l
(
e
∙
r
)
(
10.4
)
c = c_l(e \bullet r) \qquad \qquad(10.4)
c=cl(e∙r)(10.4)
通过(10.4)产生的光斑会比物理世界中的要大一些,通过phong exponent缩小其范围。
c
=
c
l
m
a
x
(
0
,
e
∙
r
)
p
(
10.5
)
c = c_lmax(0, e \bullet r)^p \qquad\qquad(10.5)
c=clmax(0,e∙r)p(10.5)
其中p为phong exponent为一个正数,效果如图所示
反射方向计算如图所示
计算公式
r
=
−
l
+
2
(
l
∙
n
)
n
(
10.6
)
r = -l + 2(l \bullet n)n \qquad\qquad(10.6)
r=−l+2(l∙n)n(10.6)
为了简化(10.5)中反射方向的计算,可以通过光线方向以及观察方向的中间方h向与法线方向的计算来进行近似
h的计算方式如(10.7)所示
h = e + l ∥ e + l ∥ ( 10.7 ) h = \frac{e+l}{\begin{Vmatrix} e+l \end{Vmatrix}}\qquad\qquad(10.7) h=∥∥e+l∥∥e+l(10.7)
(10.5)可以重新表示为(10.8)的格式
c
=
c
l
(
h
∙
n
)
p
(
10.8
)
c = c_l(h \bullet n)^p\qquad\qquad(10.8)
c=cl(h∙n)p(10.8)
同时进行ADS光照,公式如(10.9所示)
c
=
c
r
(
c
a
+
c
l
m
a
x
(
0
,
n
∙
l
)
)
+
c
l
(
h
∙
n
)
p
(
10.9
)
c = c_r(c_a + c_lmax(0, n \bullet l)) + c_l(h \bullet n)^p\qquad\qquad(10.9)
c=cr(ca+clmax(0,n∙l))+cl(h∙n)p(10.9)
可以使用高光系数来控制高光部分的颜色显示如(10.10)所示
c
=
c
r
(
c
a
+
c
l
m
a
x
(
0
,
n
∙
l
)
)
+
c
l
c
p
(
h
∙
n
)
p
(
10.9
)
c = c_r(c_a + c_lmax(0, n \bullet l)) + c_lc_p(h \bullet n)^p\qquad\qquad(10.9)
c=cr(ca+clmax(0,n∙l))+clcp(h∙n)p(10.9)
法向量的插值
三角面的法线插值可以使用三角形重心坐标来进行计算
n
=
α
n
0
+
β
n
1
+
γ
n
2
(
10.10
)
n = \alpha n_0 + \beta n_1 + \gamma n_2\qquad\qquad(10.10)
n=αn0+βn1+γn2(10.10)
其中 ( α , β , γ ) (\alpha, \beta, \gamma) (α,β,γ)为pixel的重心坐标。
10.3 Atistic Shading
Line Drawing
判断某条边是否需要描边,可以通过观察者的位置与该边关联的两个平面的法线进行计算,当 ( e ∙ n 0 ) ( e ∙ n 1 ) (e \bullet n_0)(e \bullet n_1) (e∙n0)(e∙n1)小于0,则需要描边。如果 f i ( p ) = 0 f_i(p)=0 fi(p)=0表示一个平面,也可以通过 f 0 ( e ) f 1 ( e ) < 0 f_0(e)f_1(e)<0 f0(e)f1(e)<0进行判断。
如果需要进行折痕进行绘制,可以通过 n 0 ∙ n 1 < t h r e s h o l d n_0 \bullet n_1<threshold n0∙n1<threshold进行判断。
Cold-to-Warm Shading
可以将物体阳面跟阴面分别用冷暖色进行表示,对于过度位置进行插值,计算方式如公式(10.11)所示
c
=
k
w
c
w
+
(
1
−
k
w
)
c
c
(
10.11
)
c = k_wc_w + (1 - k_w)c_c\qquad\qquad(10.11)
c=kwcw+(1−kw)cc(10.11)
其中
c
w
c_w
cw、
c
c
c_c
cc分别为暖色与冷色,
k
w
k_w
kw表示暖色系数,计算方式如下
k
w
=
1
+
n
∙
l
2
(
10.12
)
k_w = \frac{1 + n \bullet l}{2}\qquad\qquad(10.12)
kw=21+n∙l(10.12)
显示效果