【讀書筆記】計算機圖形學基礎(虎書)第10章 - 表面着色(Surface shading)


表面着色指的是用光線元素給物體表面增加額外一層材質。本章節記錄了Diffuse Shading漫反射着色,Phong着色和藝術着色Artistic Shading。

1. 漫反射着色

首先一個物理知識小科普,漫反射和鏡面反射的區別。漫反射在現實生活中是因為物體表面較為粗糙(啞光平面),導致光線入射在不同的凹面或者凸面上,導致反射光線四散的現象。與其對應的是鏡面反射,表面較為平滑,反射方向也相當的一致。

1.1 Lambertian着色模型

為了模擬漫反射物體/啞光平面開發了Lambertian模型,即表面在所有視角下亮度都是一致的且將光線完全反射出去。因此該模型顯然與視角向量無關,與光線與表面法向量之間的夾角相關。需要注意的是我們通常把光線理解為方向光,也就是光源距離物體較遠,而不是從入射點和光源之間划一條線來判斷光線的方向。為了反應不同材質的漫反射效果,我們增加了一個漫反射率\(c_r\)來記錄RGB三色的反射情況。同時我們需要一個輸入光的強度\(c_l\)。為了避免cos為負數的情況,即光線並沒有入射在平面上(從法向量的另一邊進入,屬於折射而不是反射)時,我們采用\(max(0,n\cdot l)\)而不是單純的cos值\(n\cdot l\)(這里等於cos是假設了n和l為單位向量)。還有一種方法雙向光是在對稱的地方也放一個光源,也就是兩個光源之間的光線穿過了物體,這樣則采取\(|n\cdot l|\)也就是cos的絕對值。

1.2 環境光照(Ambient Shading)

環境光照模擬物理世界中總是存在的一些光強,例如月光等。他也避免了物體在光線較少時純黑的不美觀現象。實際實現的時候可以選擇在視線處放一個光源,例如游戲里的手電筒。也可以使用之前說的雙向光的方法。最常用的是直接在光強處增加一個\(c_a\),即Ambient lighting,構成了\(c=c_r(c_a+c_lmax(0,n\cdot l))\)。這一項環境光往往會導致有些高光處超過上界如[0,1]或者[0,255],我們則需要對上界進行裁剪操作來保證輸出光在邊界內。

1.3 基於頂點的漫反射

如果一個三角形面上的法向量都一致(顯然,在物理上確實如此),那么不同角度的三角形拼接顯現出來的則會有一面一面的明顯差別,就如觀察一個高爾夫球一樣。

為了將光照變化顯得更加平滑,我們可能會讓不同的頂點擁有不同的法向量,而中間點則有插值來決定法向量。而在建模時我們有不同的方法來決定這些頂點向量,一個較為簡單的方法是對於一個被多個三角形共享的頂點而言,該頂點的法向量為周圍三角形法向量的平均值。下圖是一個插值獲得法向量的例子。

2. Phong着色

有些物體的表面屬於含有高光的啞光平面,例如白板。高光處會根據視角的變化而變化,從光學上這些高光主要和光源的顏色相關,與物體表面的關系較低。為了模擬這個效果我們在Lambertian光照的基礎上引入了Phong光照模型。

2.1 Phong光照模型

在Lambertian光照的基礎上,我們加入了反射光直入眼帶來的高光效應。兩種解法分別為直接計算反射光\(r\)並利用\(r\cdot e\)來計算夾角,第二種是在之前章節提到過的利用\(l,e\)的中間值與\(n\)之間計算夾角。為了避免負數的問題我們采用\(c=c_l*max(0,e\cdot r)\),但因為這樣很容易增加0.5左右的光強會導致大部分地方都擁有高光,所以我們額外增加了一個快速降低高光效果的冪p,得到\(c=c_l*max(0,e\cdot r)^p\)。采取不同的p顯然會讓Phong光照的效果不同,可見下圖。


就計算而言,\(r=-l+2(l\cdot n)n\),見如下示意圖,\(l\cdot n\)代表了\(l\)在平面上的高度,因此\(-l\)加上兩倍的高度相當於高度不變但是在平面的橫向位置沿着入射處翻折了。在之前提到過的計算\(e,l\)中線的方法中,中線為\(h=\frac{e+l}{||e+l||}\),這個方法主要的好處是只要光線和視線都在同一平面上則有正值,而前一個方法多在視線和光線分別居於法向量兩側的時候使用(若r和e之間的夾角大於九十度則會出現問題)。缺點是會出現開根和除法運算,計算時間會稍長一些。另外通過角度計算我們可以得出nh之間的夾角是re之間的夾角的0.5倍,這會給phong光照帶來一些別的變化。

我們可以額外引入一個\(c_p\)的控制因子來進一步控制高光的顏色,即利用\(c=c_r(c_a+c_l*max(0,n\cdot l))+c_lc_p(h\cdot n)^p\)。這里有一個有意思的事情要注意,在之前的某些章節和之后的顏色里提到過,油畫等顏色是減法律的(顏料吸收了一部分),光是加法律的(光線混合),計算機圖形和物理建模將它理解為乘法律,具體原因可以參考之后的章節,我的初步猜想是因為光譜頻率本身就不適合用加法。因此這里\(c_l*c_p\)形容的就是入射光線和另一種光之間的混合效果。對於金屬表面我們使用\(c_p=c_r\),即讓入射光和金屬顏色直接混合。文中還提到讓\(c_p=1-M\),其中\(M\)\(c_r\)三色中的最大值(我個人認為應該是\(c_r(c_a+c_l)\)的最大值,不過也有可能是這里的公式隱藏了clamp超出部分這一步,如果有這一步的話那么\(M\)等於\(c_r\)三色最大值是合理的),這樣就確保了最后的顏色不超出界限\(1\)

最后重復一次,如果采取Gouraud Shading,即在頂點着色器中混合法向量,因為法向量改變在Phong光照模型中對顏色變化較大,很容易出現三個頂點和最亮處的法向量類似但是三個頂點的着色顏色較低,結果顏色插值后的最亮點變暗了的情況。這一現象在下圖中較為明顯。Phong着色即在片元着色器部分才開始對每一個片元計算着色(之前則會基於三個頂點在片元上插值得出法向量),最后的結果則會更加貼近真實情況。這一部分在本知乎鏈接中有較好的解釋。

3. 藝術渲染(非真實渲染)

之前的兩個模型是真實渲染的基礎,現在我們開始聊一聊基礎的藝術渲染。這個知乎文章有一個比較好的導引。

3.1 描邊

首先是剪影(silhouettes)或者說輪廓。在三維世界的三角形中,如果我們要繪畫輪廓,我們需要繪畫的那一條邊需要滿足其一邊的三角形面朝攝像機,而另一個三角形背朝攝像機的特征。這也可以理解為可見和不可見的邊界(輪廓)。如果三角形的面有法向量\((n_1,n_2)\),則我們可以簡單檢查\((e\cdot n_1)(e\cdot n_2)\leq 0\)即可(這個方法似乎會畫多個垂直於視線的面的輪廓,但是個人認為這樣總比有些輪廓畫不出來要好,同樣的地方z-buffer一下就可以了)。同樣如果我們運用隱式函數的方法,那么就是\(f_0(e)f_1(e)\leq 0\)

其次是可視多面體的繪制,我們很多時候會選擇描繪角度改變較大地方的輪廓,例如一個人的鼻子,而不是整個臉上的三角形邊都一個一個的畫。如下圖所示,主要繪畫輪廓線即可。在圖形學計算的時候我們僅在\(n_0\cdot n_1\)低於一定值的時候進行繪畫(注意點乘cos在180度內隨着角度增加而減小)。

3.2 Cool to Warm Shading (Gooch Shading),暫且稱為冷暖色着色

這個做法是對於面向A面的表面用冷色調(藍色等)繪畫,面向B面的表面用暖色調(橙色)等繪畫來增加對比度。通常這些顏色的飽和度都不會太高或者太低,這樣黑色的輪廓線就較為明顯。他的實現方法是將光線視為暖色調,然后得到warmth constant溫度常數\(k_w=\frac{1+n\cdot l}{2} \in[0,1]\)。我們利用這個常數來混合冷暖色調\(c=k_wc_w+(1-k_w)c_c\),其中\(c_c,c_w\)分別是冷色調和暖色調的顏色。下圖分別是Phong着色,單獨的冷暖色着色,以及冷暖色着色+輪廓。理論上這個圖的冷暖色着色還加了一些底色,否則應該是看起來更為單調的樣子,例如第二個圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM