Chapter 10 Surface Shading

(个人笔记,由于刚开始学习再加上英语不太好,所以有的地理解的可能不太对,望指正)

Chapter 10 Surface Shading

10.1 Diffuse Shading

Lambertain Shading Model

Chapter 10 Surface Shading

其中n表示表面法线方向,l表示光照方向,表面颜色正比于θ,公式为
c=crclnl(10.1) c = c_rc_ln\bullet l\qquad\qquad(10.1)

其中crc_r表示漫反射系数,clc_l表示光照强度,它的取值范围为[0, 1],为了防止负值的出现将公式(10.1)表示为以下形式
c=crclmax(0,nl)(10.2) c = c_rc_lmax(0, n\bullet l)\qquad\qquad(10.2)

Ambient Shading

如果只是用漫反射公式(10.2)来表示光照效果那么会有一个问题,在光线照不到的位置会是完全黑的,添加环境光来给添加一个默认亮度
c=cr(ca+clmax(0,nl))(10.3) c = c_r(c_a + c_lmax(0, n\bullet l))\qquad\qquad(10.3)

其中cac_a表示所有表面接收到的环境光的平均值

10.2 Phong Shading

Chapter 10 Surface Shading

其中n表示法线方向,l表示光照方向,r表示反射方向,e表示观察方向。σ表示观察方向与反射方向的夹角,越大高光效果应该越弱,该影响可以表示为
c=cl(er)(10.4) c = c_l(e \bullet r) \qquad \qquad(10.4)

通过(10.4)产生的光斑会比物理世界中的要大一些,通过phong exponent缩小其范围。
c=clmax(0,er)p(10.5) c = c_lmax(0, e \bullet r)^p \qquad\qquad(10.5)

其中pphong exponent为一个正数,效果如图所示

Chapter 10 Surface Shading

反射方向计算如图所示
Chapter 10 Surface Shading

计算公式
r=l+2(ln)n(10.6) r = -l + 2(l \bullet n)n \qquad\qquad(10.6)

为了简化(10.5)中反射方向的计算,可以通过光线方向以及观察方向的中间方h向与法线方向的计算来进行近似

Chapter 10 Surface Shading

h的计算方式如(10.7)所示

h=e+le+l(10.7) h = \frac{e+l}{\begin{Vmatrix} e+l \end{Vmatrix}}\qquad\qquad(10.7)

(10.5)可以重新表示为(10.8)的格式
c=cl(hn)p(10.8) c = c_l(h \bullet n)^p\qquad\qquad(10.8)

同时进行ADS光照,公式如(10.9所示)
c=cr(ca+clmax(0,nl))+cl(hn)p(10.9) c = c_r(c_a + c_lmax(0, n \bullet l)) + c_l(h \bullet n)^p\qquad\qquad(10.9)
可以使用高光系数来控制高光部分的颜色显示如(10.10)所示
c=cr(ca+clmax(0,nl))+clcp(hn)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)

法向量的插值
三角面的法线插值可以使用三角形重心坐标来进行计算
n=αn0+βn1+γn2(10.10) n = \alpha n_0 + \beta n_1 + \gamma n_2\qquad\qquad(10.10)

其中(α,β,γ)(\alpha, \beta, \gamma)为pixel的重心坐标。

10.3 Atistic Shading

Line Drawing

判断某条边是否需要描边,可以通过观察者的位置与该边关联的两个平面的法线进行计算,当(en0)(en1)(e \bullet n_0)(e \bullet n_1)小于0,则需要描边。如果fi(p)=0f_i(p)=0表示一个平面,也可以通过f0(e)f1(e)<0f_0(e)f_1(e)<0进行判断。

如果需要进行折痕进行绘制,可以通过n0n1<thresholdn_0 \bullet n_1<threshold进行判断。

Cold-to-Warm Shading

可以将物体阳面跟阴面分别用冷暖色进行表示,对于过度位置进行插值,计算方式如公式(10.11)所示
c=kwcw+(1kw)cc(10.11) c = k_wc_w + (1 - k_w)c_c\qquad\qquad(10.11)

其中cwc_wccc_c分别为暖色与冷色,kwk_w表示暖色系数,计算方式如下
kw=1+nl2(10.12) k_w = \frac{1 + n \bullet l}{2}\qquad\qquad(10.12)

显示效果

Chapter 10 Surface Shading