真實感電腦圖形學(二)--消隱及真實感圖形產生
1 消隱 在電腦圖形學中,有三種方式表示三維物體:線框圖、消隱圖和真實感圖。其中真實感圖形的產生也要在消隱基礎上進行光照處理。所謂消隱就是給定一組3D 物件及投影方式(視見約束),判定線、面或體的可見度的過程。根據消隱在間的不同,消隱演算法可分為兩類: · 物體空間的消隱演算法,消隱在正常化投影空間中進行,將物體表面的k個多邊形中的每一個面與其餘的k-1個面進行比較,精確地求出物體上每條棱邊或每個面的遮擋關係。這類演算法的計算量正比於k2。 · 圖象空間的消隱演算法,消隱在螢幕座標系中進行,對螢幕上的每一個象素進行判斷,確定在該象素點上可見的面。若螢幕解析度為m×n,物體空間中共有k個多邊形,則此類演算法的的計算量正比於mnk。 大多數消隱演算法都涉及排序和相關性的概念。排序是為了確定消隱對象之間的遮擋關係,通常在X、Y、Z三個方向分別進行。消隱演算法的效率在很大程度上取決於排序的效率。相關性是指物體對象或其變換後的圖象局部保持不變的性質,在消隱演算法中利用相關性是提高排序率的重要手段。 常用的物體空間消隱演算法有多邊形地區排序演算法和列表優先演算法等。 Z-Buffer (深度緩衝)是最簡單的圖象空間面消隱演算法,深度緩衝數組的使用避免了複雜的排序過程,在解析度一定的情況下,演算法計算量只與多邊形個數成正比。該演算法也便於硬體實現和平行處理。在此基礎上,Z-Buffer掃描線演算法利用了多邊形邊和象素點的相關性,使得演算法效率進一步提高。掃描線演算法也為簡單光照模型提供了良好的消隱基礎。
2 簡單光照模型及明暗處理
光照模型(Illumination Model)是根據有關光學定律,計算真實感圖形中各點投射到觀察者眼中的光線強度和色彩的數學模型。簡單的局部光照模型假定光源是點光源,物體是非透明體,不考慮折射,反射光由環境光線、漫反射光和鏡面反射光組成。 環境光線的特點是:照射在物體上的光來自周圍各個方向,又均勻地向各個方向反射。計算公式為: 其中Ia為環境光線強度(常數);Ka為物體表面對環境光線的反射係數。 漫反射光是物體向周圍均勻地反射的光線,根據朗伯(Lambert)餘弦定律可以給出計算公式: 其中Kd 為物體表面的漫反射係數;Ip,j為某一點光源所發出的入射光強度;θi為該光源的入射角,即物體表面法向量N和點光源入射光線向量Li之間的夾角(cosθi = N·Li)。 為類比高光,B.T.Phone提出了Phone鏡面反射模型: 其中Ks為物體表面的法向量;n為鏡面反射光匯聚指數;αi為某一點光源在物體表面上產生的鏡面反射光方向(Ri)與視線方向(V)之間的夾角,即cosαi = Ri·V)。 綜上所述,物體表面任意一點向觀察點的反射光強度I=Ie+Id+Is計算公式為: 或表示成各單位向量的點積形式: 實際應用時,應對光強的紅、綠、蘭分量分別進行處理。 在電腦圖形學中曲面通常由多邊形近似表示,有兩種增量式明暗處理演算法可以解決多邊形之間亮度和色彩的光滑過渡問題,即雙線性亮度插值法( Gouraud Shading)和雙線性法向量插值法(Phong Shading)。 Gouraud的方法主要針對簡單光照模型中的漫反射項,先計算物體各頂點的平均光強,然後用雙線性插值求出多邊形內每一點的光強。這種方法計算量較小,但無法完全消除馬赫帶效應,存在演算法難以處理的奇異情況,對高光的處理也不夠理想。 Phong的方法同樣是增量線性插值,但進行插值的是頂點處的平均法向量,對多邊形中的象素點,由插值得到的法向量分別計算光強。這種方法克服了亮度插值的一些不足,並可以很好地處理鏡面反射,但計算量較Couraud方法為大。 基於局部光照模型及明暗處理的陰影產生演算法也有很多。陰影是指景物中哪些沒有被光源直接照射到的按區。在電腦產生的真實感圖形中,陰影可以反映畫面中景物的相對位置,增加圖形的立體感和情境的層次感,豐富畫面的真實感效果。陰影可分為本影和半影兩種。本影加上它周圍的半影組成軟影區。單個點光源照明只能形成本影,多個點光源和線光源才能形成半影。 對多邊形表示的物體,一種計算本影的方法是影域多邊形方法,環境中物體的影域定義為視域多面體和光源在景物空間中被物體輪廓多邊形遮擋的地區的交集。這種方法的實現可以利用現有的掃描線消隱演算法。Athherton等人提出了曲面細節多邊形方法,以多邊形地區分類的隱藏面消去演算法為基礎,通過從光源和視點兩次消隱產生陰影。 以上兩種陰影產生方法只適用於用多邊形表示的景物,無法解決光滑曲面片上的陰影產生問題。為此,Williams提出了Z-Buffer方法,首先利用Z-Buffer演算法按光源方向對景物進行消隱,然後再用Z-Buffer演算法按視線方向進行會制。這種方法可以方便地在理包括光滑曲面的任意複雜的景物,但儲存量大,陰影地區附近易產生走樣。
3 整體光照模型與光線跟蹤
照射到物體上的光線,不僅有從光源直接射來的,也有經過其它物體反射或折射來的。局部光照模型只能處理直接光照,為了對環境中物體之間的各種反射、折射光進行精確類比,需要使用整體光照模型。 相對於局部光照模型,整體光照模型可以表示為Iglobal=KRIR+ KTIT。其中Iglobal為非直接光照對物體上一點光強的貢獻;IR為其他物體從視線的反射方向R反射或折射來的光強,KR為反射係數;KT為其他物體從視線的折射方向T折射或反射來的光強,IT為折射係數。將Iglobal與局部光照模型的計算結果相疊加,就可以得到物體上點的光強。 光線跟蹤演算法是典型的整體光照模型,最早由Goldste、Nagel和Appel等人提出,Appel用光線跟蹤的方法計算陰影;Whited和Kay擴充了這一演算法,用於解決鏡面反射和折射問題。演算法的基本思想如下: 對於螢幕上的每個象素,跟蹤一條從視點出發經過該象素的光線,求出與環境中物體的交點。在交點處光線分為兩支,分別沿鏡面反射方向和透明體的折射方向進行跟蹤,形成一個遞迴的跟蹤過程。光線每經過一次反射或折射,由物體材質決定的反射、折射係數都會使其強度衰減,當該光線對原象素光亮度的貢獻小於給定的閾值時,跟蹤過程即停止。光線跟蹤的陰影處理也很簡單,只需從光線與物體的交點處向光源發出一條測試光線,就可以確定是否有其他物體遮擋了該光源(對於透明的遮擋物體需進一步處理光強的衰減),從而類比出軟影和透明體陰影的效果。 光線跟蹤很自然地解決了環境中所有物體之間的消隱、陰影、鏡面反射和折射等問題,能夠產生十分逼真的圖形,而且演算法的實現也相對簡單。但是,作為一種遞迴演算法其計算量十分巨大。盡量減小求交計算量是提高光線跟蹤效率的關鍵,常用的方法有:包圍盒(entents)、階層(hierarchies)及地區分割(spatial partitioning)等技術。 光線跟蹤是一個典型的採樣過程,各個螢幕象素的亮度都是分別計算的,因而會產生走樣,而演算法本身的計算量使得傳統的加大採樣頻率的反走樣技術難以實用。 象素細分是一種適用於光線跟蹤的反走樣技術,具體方法是: 首先對每一象素的角點用光線跟蹤計算亮度;然後比較各角點的亮度,若差異較大,則將象素細分為4個子領域,並對新增的5個角點用光線跟蹤計算亮度;重複比較與細分,直到子領域各角點亮度差異小於給定的閥值為止;最後加權平均求出象素點的顯示亮度。 與象素細分不同,Cook、Porter和Carpenter 提出的分布式光線跟蹤是一種隨機採樣的方法,在交點處鏡面反射方向和折射方向所夾的立體角內,按照一定的分布函數同時跟蹤若干根光線,然後進行加權平均。Cook等人還提出了利用分布式隨機採樣技術類比半影、景深和移動模糊等效果的方法。 光線跟蹤的另一個問題是,光線都是從視點發出的,陰影測試光線則需另外處理,因而無法處理間接的反射或折射光源,例如鏡子或透鏡對光源所產生的作用就難以類比。為解決這一問題,可以從光源和視點出發對光線進行雙向跟蹤。但是,大量從光源出發的光線根本不可能到達螢幕,這使得雙向光線跟蹤的計算量顯著增大,難以實用。Heckbert和Hanrahanr提出的解決方案是只將從光源出發的光線跟蹤作為常歸光線跟蹤的補充;Arvo方法則是對從光源發出進入環境的光線進行預先處理;邵敏之和彭群生等人也提出了基於空間線性八叉樹結構的對光源所發出光線進行最佳化的雙向光線跟蹤演算法。
4 漫反射和輻射度方法
常規光照模型假設物體間的漫反射是一個恒定的環境光線,即使雙向光線跟蹤也只能處理物體間的反射與折射,而不能處理物體間的漫反射。最初由Goral等人於1984年及Nishita等人於1985年提出的輻射度方法是一種基於熱能工程的方法,用光輻射的產生和反射代替環境光線,從而能夠精確處理對象之間的光反射問題。 輻射度方法將景物和光源視為一個封閉的系統,在系統中光能量是守衡的;並假定構成景物的曲面都是理想的漫反射面。所謂輻射度,是指單位時間內從曲面上單位面積反射出去的光能量,記為B。在理想情況下,可以近似認為逼近曲面的面片上的光強是均勻的,即漫反射各向均勻。根據能量守衡定律,每個面片上的輻射度為: 其中 Bi面片i上微分元dAi的輻射度;Ei為面片i本身作為光源向空間均勻輻射出的光能;ρi為dAi的漫反射率;BjFij為面片j向dAi輻射的光能,Fij為其他面片上微分元dAj對於dAi的形狀因子。環境中的每一個面片都存在以上關係,對於具有n個面片的情境可以得到如下聯立方程: 其中Ei只當面片i本身為發光體的表面時才不為零,代表了系統中光能量的來源;形狀因子Fij只與景物的幾何位置有關。 通過上述線性方程組不難解出各面片的輻射度Bi,也就等於解出了面片的光亮度Ii。利用雙線性插值;以這組亮度作為初值,就可計算出面片各頂點的亮度;最後針對特定視點插值求得螢幕各象素點的亮度值,產生最終的圖象。 輻射度方法的主要計算量在於計算形狀因子。Cohen和Greenberg提出的半立方體方法是一種近似計算封閉面形狀因子的高效方法。首先以面片i的中心為原點,法向量為Z軸建立一個半立方體,將其五個表面劃分成均勻的網格,每個網格單元的微形狀因子可以預先求得;然後將情境中所有其他面片都投影到半立方體上,對於多個面片投影到同一個網格單元的情況需在投影方向上進行深度比較,網格單元只保留最近的面片,這一過程相當於Z-Buffer演算法;最後將半立方體中所有與面片j相關的網格單元的微形狀因子累加,即可得到面片i相對於面片j的形狀因子Fij。 輻射度方法的優點在於演算法與視點無關、計算和繪製可以分別獨立進行、能夠類比顏色滲透效果等,但無法處理鏡面反射與折射。 在輻射度方法中,面片向特定方向輻射出的光能量僅總輻射度有關,而與所接受能量的方向無關。Immel、Cohen和Greenberg推廣了這一方法,每個面片不只計算唯一的輻射度,而是將面片半球空間分割成有限個空間立體角的地區,在每個地區內分別計算輸入輸出的光能量,通過雙向輻射Function Compute向某一方向輻射能量的機率,每個頂點的光強可以通過對與視點方向最為接近的若干方向上的輻射度進行插值得到,並最終完成圖形產生。這種改進方法可以處理包含鏡面和透明物體的複雜情境,但要付出巨大的時間開銷和空間開銷。 另一種方案是將輻射度與光線跟蹤相結合,僅僅將兩種方法的計算結果相加是不夠的,必須同時處理漫反射面和鏡面之間的光照關係。Wallace、Cohen和Greenberg提出了一種兩步方法:第一步執行與視點無關的輻射度方法,輻射度的計算必須考慮鏡面,這可以通過鏡象法(mirror-world approach)予以類比;第二步執行基於視點的光線跟蹤演算法,處理整體鏡面反射和折射,並產生圖形。演算法效率的關鍵在於第一步,其中鏡象法只需處理理想鏡面的反射作用,並據此對形狀因子加以修正,形狀因子的計算量將隨鏡面數量的增加而顯著增加。Sillon和Puech進一步擴充了上述兩步法,在第一步時不採用鏡象法,而是用遞迴的光線跟蹤來計算形狀因子,可以處理具有任意數量鏡面及透明體的情境。
5 紋理映射
紋理映射(Texture Mapping)是通過將數字化的紋理圖象覆蓋或投射到物體表面,從而為物體表面增加表面細節的過程。紋理圖象可以通過採樣得到,也可以通過數學函數產生。物體的很多表面細節多邊形逼近或其他幾何建模的方法是難以表現的,因此紋理映射技術能夠使得電腦產生的物體看起來更加逼真自然。 紋理映射技術最早由Catmull提出,經Blinn和Newell改進後得到廣泛應用,成為電腦圖形學中的一種重要方法。將紋理映射到物體表面,可以看作是將一個螢幕象素投影到紋理空間的對應地區並計算該地區的平均顏色,以求得真正象素顏色的最佳近似值。具體地說,紋理圖象存在於獨立的紋理空間中,映射分為兩步進行,先將螢幕象素通過四個角點座標映射到三維物體表面,再進一步映射到紋理空間,形成一個四邊形地區,即對螢幕象素映射到三維物體表面上所形成的複雜曲面片的近似。螢幕象素的紋理映射結果可以通過對紋理空間中四邊形地區進行累加得到。也可以採用相反的映射方式,即從紋理空間到三維物體再到螢幕象素進行映射,但這種映射方式需要佔用更大的儲存空間,更易產生走樣,並且無法應用於掃描線演算法。 物體表面的紋理可分為兩類:顏色紋理和幾何紋理。顏色紋理主要是指同一表面各處呈現出不現的花紋和顏色;幾何紋理主要指物體表面在微觀上呈現出的起伏不平。上述紋理映射方法只能處理顏色紋理,所產生的物體表面仍然是光滑的。Blinn在紋理映射基礎上提出的Bump Mapping方法是一種類比物體表面粗糙紋理的技術,可以不用對物體的粗糙表面在幾何上進行建模就可以改善物體表面的微觀結構,如大理石紋理表面雕刻的文字、混凝土牆面等效果。此外,更進階的真實感圖形效果如人臉上流淌的汗水也可以通過隨時間變化的Bump mapping來類比。Bump Map是一個二維數組,數組中每個元素是物體表面上一點比其實際位置略高或略低的位移向量。這些微小位移被映射到物體表面一點後修正該點處的法向量,通過修正後的法向量進行光照計算。 紋理圖象和螢幕象素都是離散的採樣系統,很容易產生走樣,即丟失紋理細節,使表面邊界產生鋸齒。紋理映射中常用的反走樣方法是卷積濾波法。螢幕象素是一個矩形地區,映射到紋理空間上為一任意四邊形,卷積濾波法就是取四邊形所覆蓋地區的紋理函數的卷積作為螢幕象素的光亮度,可以採用盒形、三角形、高斯分布及樣條函數等作為濾波函數。在實際應用中為簡化計算,常用正方形、矩形或橢圓等形狀近似表示螢幕象素所覆蓋的任意四邊形地區。卷積濾波法是非線性,計算量較大,並且不適用於Bump Mapping,因為Bump Mapping的紋理函數與象素的光亮度之間不是線性關係,此時可以使用前置濾波法。前置濾波是在紋理空間中按照不同的解析度將一定地區內的紋理平均值預先算好,執行映射時只需按照螢幕象素所覆蓋的地區大小選取一定的解析度查表,並作適當線性插值即可。 以上二維映射在很多情況下都能得到很好的效果,但有時會產生失真,如在三維曲面上仍會呈現出二維效果,以及產生紋理接縫問題等。Peachey和Perlin提出了一種基於實體紋理的方法,用物體上點在三維空間的位置的函數作為紋理,從而更精確地表現木材或大理石等的雕刻效果。 其他一些材質的表面也可以用適當的方法類比,如Gardner的透明映射方法可以用簡單的形狀類比雲彩。此外,很多基於物理模型、隨機過程和分形幾何等的方法也被用來產生自然紋理。
參考文獻 [1] Donald Hearn, M. Pauline Baker. Computer Graphics C Version, 2nd Edition, 清華大學出版社, 1998 [2] Alan Watt. 3D Computer Graphics, 2nd Edition. Addison-Wesley, 1993 [3] 唐榮錫, 汪嘉業, 彭群生等. 電腦圖形學教程. 科學出版社, 1994 [4] 唐澤聖, 周嘉玉, 李新友. 電腦圖形學基礎. 清華大學出版社, 1995 作者會員名:dipper |