flat著色和Gourand著色
若渲染速度并不重要,我們可以逐像素地計算光照和霧化。(對于光照,這項技術稱作Phong著色模型----不要和鏡面反射的Phong模型混淆。)然而這樣做計算量過于巨大,所以我們折中并減少計算的頻率。有兩個選擇:逐多邊形或逐頂點計算,這兩項技術分別稱作flat著色和Gourand著色。
使用flat著色,對整個三角形只計算一次光照值。通常計算光照的位置為三角形中心,表面法向量為三角形法向量。如圖15.17所示,使用flat著色,物體由多邊形構成的本質表露無遺,沒有任何光澤可言。

Gourand著色,又稱作頂點著色或插值著色。在頂點級計算光照和霧,然后這些值被線性插值用于整個多邊形面,圖15.18是和圖15.17同樣的茶壺,但采用Gourand著色。

顯然,Gourand著色在保持物體的光滑性上做的較好。當被模擬的值本來就是線性時,Gourand著色能得到很好的效果。問題在于如果這些值不是線性變化,比如鏡面高光。比較Gourand著色茶壺的高光部分和Phong著色茶壺的高光部分,如圖15.19所示。Phong著色中,除去幾何不連續的把手、壺嘴部分,高光的連續性很好,而Gourand著色中,由其高光面甚至可辨出各個小面元的分布。

線性插值的基本問題是內插值不可能大于較大的頂點值,所以高光只能在頂點出現,充分細化可解決這一問題。盡管有著自身的局限性,Gourand著色仍是現今硬件最常用的方法。
緩存
渲染涉及大量的緩存,這里緩存只是一個簡單的存有像素數據的矩形內存塊,最重要緩存是幀緩存和深度緩存。
幀緩存存儲每個像素的色彩,即渲染后的圖像。色彩可能有多種格式,但就當前的討論來說,不考慮格式的差異。幀緩存常常在顯存中,顯卡不斷讀取該內存,并將二進制數據轉化為CRT接收的合適信號。所謂雙緩存技術,是為了防止圖像在未完全渲染好之前就被顯示。此時實際上使用了兩個幀緩存,一個緩存存放當前顯示的圖像,另一個離線緩存存放正在渲染的圖像。
一旦渲染完成并準備好顯示即切換緩存,有兩種方式:
(1)如使用頁切換技術,則命令顯示卡開始從離線緩存讀取數據,接著對調兩個緩存的角色,現在的顯示緩存變為離線緩存。
(2)也可以將離線緩存復制到顯示緩存。
圖15.20顯示了雙緩存的情況:

另一個用于渲染的重要緩存是深度緩存----也稱作z-buffer。深度緩存不存儲像素的顏色,而代之以像素的深度信息。存入緩存的深度信息有多種不同的變體,但它們基本上都反映物體到攝像機的距離。實踐中通常保存的都是裁剪空間的z坐標,這就是z-buffer名稱的由來。
深度緩存一般用于計算物體之間的遮擋,當光柵化三角形時,計算各像素的插值深度。在渲染像素之前,將這個深度值和深度緩存中該像素的深度值比較,如果新的深度比現有值離攝像機更遠,則新的像素被丟棄;否則像素顏色被寫到幀緩存,并用新的更近的值更新深度緩存。在開始進行新的渲染之前,記得要置z-buffer各值為無限遠(在裁剪空間中,這個值為1.0),這樣第一批像素才能通過深度測試,一般不對z-buffer設置雙緩存。
紋理映射
物體外觀不僅僅限于形狀,不同物體的表面有著不同的顏色和圖案,一個簡單而有效的實現這種特性的方法是使用紋理映射。
紋理圖是一個鋪在物體表面上的位圖,使用紋理圖可以在"texel"(一個texel是紋理圖中的一個像素)級別控制顏色,這優于在頂點或三角形級別控制物體顏色,也許你已經經過紋理映射的實例,不過還請看看下面的例子,它展示了紋理的強大威力。圖15.21展示了一個紋理映射前和后的3D人物模型"Rayne"。

紋理圖不過是一個貼在模型表面的位圖,它是如何把整個物體包起來的?實際上,有多種不同方法,可以將網格用紋理圖包起來。平面映射線性地將紋理投射于三角網,球形映射、柱形映射和立方體映射則有不同的投射方式,這里每項技術的細節并不重要,因為建模軟件如3D
Studio Max會處理它們。無論位圖如何放置,每個頂點都要賦給一個紋理映射坐標,也就是位圖上的2D笛卡爾坐標,通常稱它們為u、v,以防止和渲染坐標x、y混淆。紋理映射通常按照位圖尺寸單位化為[0,
1]之間的值,如圖15.22,給出了圖15.21模型中的一個紋理。

此紋理圖為Rayne的頭部所用,包圍在頭部的一半,從鼻子到后腦中線。藝術家特意使她的尺寸合適于模型,頭部的另一半使用同樣的紋理,一個鏡像。
注意紋理不一定要連續地包圍幾何體。因為每個三角形都能獨立映射,紋理的不同部分可以任意映射到物體的不同部分。比如上圖中左上角的牙齒就是這樣:Rayne有毒牙,嘴張開時可以看見。當然如果不使用連續映射,且紋理映射坐標存儲在頂點級,紋理交界處對應的頂點坐標是雙份的。注意這里對紋理使用了原點在左上角的坐標系,這類似于硬件訪問的方式,更具學術性的文獻則使用左下角為坐標原點。
如前所述,各頂點都有一個紋理的u、v坐標。用這種方式,紋理被釘在三角網上,要渲染三角形中的某個像素,可以先插值計算其u、v坐標(類似于Gourand著色),然后讀取對應的紋理值。