着色英文名叫shading,在韋氏字典里的意思表達的是一個物體的明暗和顏色,在圖形學中有特殊的含義,即:將材質應用於對象的過程。
shading有很多種方式,這里介紹其中一種比較簡單的,叫Blinn-Phong 反射模型。
我們知道,人的眼睛能看到物體表面的明暗和顏色,是因為光射到了物體上,然后反射到人的眼睛里。
反射有三種方式:高光 Specular highlights、漫反射 Diffuse reflection、環境光Ambient lighting。
對於每一個單獨的物體,為了衡量光線的強度 ,我們定幾個參數作為輸入項,根據這幾個參數,可以得到最后的顏色。
着色點 shading point:我們假設物體表面有無數個點可以反射光,每個點為一個shading point
法線向量 n:沿物體表面,過shading point做一條切線,垂直於這條切線並向外的線,設為單位向量
光源方向向量 l:從shading point連向光源的線,設為單位向量
觀測方向向量 v:從shading point連向攝像機的線,設為單位向量
現在把高光、漫反射、環境光分別用以上參數做分析。
漫反射
我們可以認為,漫反射是光線以一定的角度直射到物體表面,均勻的反射到各個方向。
Blinn-Phong 反射模型認為,漫反射受到3個因素疊加而成,分別是光源到物體的距離、光線跟物體的角度、物體的材質。
光源到物體的距離
我們把光線看成一種能量,一束光外擴散,總能量不變,范圍便大,強度變低。光的強度跟距離的平方成反比。
我們用I/r²表示能量到達系數,I表示光強度,r表示擴散半徑。
光線跟物體的角度
就像太陽的直射會造成夏季一樣,光射向物體的角度會造成物體表面單位面積的光密度不同,從而接收到的光強度不同。當角度θ越接近0°強度最大,物體越亮;越接近90°強度越小,物體越暗。
我們用max(0, n · l) 表示接收系數,n和l分別是法向量和光源向量,他們的乘積等於兩個向量的夾角cosθ的值(0°時為1,90°時為0)。max的作用是如果值為負並不會有衰減。
物體的材質
不同的材質表面吸收的光不同,導致人看到的顏色不同。
我們用kd表示材質漫反射系數。
從左到右不同的材質, 同樣強度同樣角度的光照所反射的顏色不同。
綜上所述,可以用一個公式來表示漫反射的總顏色值:
高光
Blinn-Phong 反射模型認為,高光是一束很窄的光,只有反射向量和觀測向量非常接近時,才能被觀測到。
跟漫反射類似,我們可用光源到物體的距離、反射向量和觀測向量的夾角、物體的材質三個因素疊加形成高光。(跟漫發射不同的是,Blinn-Phong 反射模型的高光不會考慮接收強度,也就是光線跟物體的角度)。
但是由於反射向量的計算量比較大(根據入射方向和法線向量求出),Blinn-Phong 提出了一種優化方法,即法線向量n和半程向量h的夾角,可以一定程度來表示R和v是否接近。
而半程向量非常好求,l + v后再做歸一化即可得。
這里需要注意的是,因為最后的夾角會影響到是否能觀察到高光,而用簡單的cos函數會導致能被觀測到的范圍非常大,例如當α=45°,cos並不等於0,相當於偏移45度依然能觀察到高光,顯然跟現實不太符合。這里的方法是把cos函數變成cos次方函數,通過調整次方p的值調整可見范圍。一般p的值為100~200,把可見范圍調整到3°~5°。
由此可得到Blinn-Phong 反射模型下的高光公式:
環境光
Blinn-Phong 反射模型認為,環境光跟光源的距離、射入角度的關系不大,可以把所有所有射入的光線因素當成常量I,然后再加上物體的材質,總共2個因素。
因此,在Blinn-Phong 反射模型中,環境光的強度是一樣的(常量I),意味着如果物體的材質一樣,所有只有環境光反射的地方(比如背面),看起來都是平的(沒有明暗分別),不管這個地方是凹還是凸。
總結:
1.高光受光照強度、入射角度(Blinn-Phong模型不考慮)、觀測角度、材質系數影響;
2.漫反射受關照強度、入射角度、材質系數影響;
3.環境光受常數I和材質系數影響。
高光 Specular highlights、漫反射 Diffuse reflection、環境光Ambient lighting三種反射疊在一起,即為最終的Blinn-Phong 反射。