當(dāng)三角形的頂點轉(zhuǎn)換到裁剪空間后,我們對三角形做兩個重要測試。注意,這里討論的順序并不一定是硬件執(zhí)行的順序。
背面剔除
第一個測試稱作背面剔除,其目的是去除背面攝像機(jī)的三角形。在標(biāo)準(zhǔn)三角網(wǎng)格中,我們永遠(yuǎn)看不到三角形背面,除非進(jìn)入那些多面體內(nèi)部。去除這些三角形并非必要,畫出它們依然得到正確的圖像,因為它們會被前方的三角形蓋住。但我們不想浪費時間去繪制任何看不見的物體,所以我們常做背面剔除,特別是在理論上有一半的三角形為背向的。
實踐中,只有少于一半的三角形能被剔除,特別是靜態(tài)場景中,創(chuàng)建時就沒有背面(如地形面)。當(dāng)然,也還能去掉一些背向三角形(比如山背后),但如果我們高于地面,多數(shù)面仍為正向的。然而,動態(tài)物體就有可能節(jié)約一半的背面了。
有兩種方法可用于探測背向三角形。第一種是裁剪和投影的,在裁剪空間(或攝像機(jī)空間)中進(jìn)行的。基本思想是判斷眼睛是否在三角形所在平面的前面,如圖
15.23所示,將背向剔除的面都用灰色繪制。注意背向剔除不依賴于視錐,實際上,它甚至不依賴于攝像機(jī)朝向,只考慮三角形與攝像機(jī)的相對位置。

為在3D中執(zhí)行背面剔除,需要三角形法向量和一個從眼睛到三角形的向量(可取三角形上任何一點,我們經(jīng)常任取一頂點)。如果上面兩個向量的方向大致相同(點積大于0),則三角形為背向的。前述背面剔除方法主要用于軟件渲染的時代,那時候預(yù)先計算好的表面法向量存儲在三角形級。如今,由于向渲染硬件投送幾何體已經(jīng)稱為瓶頸,這類多余的信息都不再發(fā)送了。當(dāng)今圖形硬件上,通常利用屏幕空間中三角形頂點的順序(順時針或逆時針)進(jìn)行背面剔除。這里約定,從前面看時,三角形頂點順序為順時針。于是,便可剔除那些逆時針頂點順序的三角形。API允許用戶控制背面剔除,有時可以在渲染特殊幾何體時不進(jìn)行剔除,或者當(dāng)物體反轉(zhuǎn)的時候可將前面的剔除順序反過來。
裁剪
即使正對攝像機(jī),三角形也可能部分或完全在視錐外而不可見。在投影到屏幕空間之前,一定要確保它們完全在視錐內(nèi),這個過程稱作裁剪,裁剪一般由硬件完成。標(biāo)準(zhǔn)多邊形裁剪算法是Sutherland-Hodgman算法,它將多邊形分裂為多個小多邊形來解決裁剪問題,裁剪完后再組合起來。對平面做多邊形裁剪時,沿邊遍歷多邊形,依次對每邊進(jìn)行裁剪。邊的兩個頂點要么在或不在平面內(nèi),所以總共有四種情況,每種情況產(chǎn)生0、1、2個輸入點,如圖15.25:

圖15.26顯示了右裁剪多邊形的情形。注意,裁剪輸出頂點而不是邊。圖15.26中,邊畫出來只是為了說明。特別是最后一步似乎產(chǎn)生兩條邊,但實際只產(chǎn)生一個頂點----最后一條邊只是為了封閉多邊形加上的。

在每一階段的最后,如果保留的頂點數(shù)少于三個,則多邊形不可見(注意1個或2個頂點無法組成多邊形,輸出頂點數(shù)只能為0或至少3個)。一些圖形硬件不在3D中做所有6個面的裁剪,而代之以近面和2D裁剪。
光柵化
裁剪以后,根據(jù)公式15.6,頂點終于可以投影到屏幕坐標(biāo)了。當(dāng)然這些坐標(biāo)是浮點型的連續(xù)坐標(biāo),而我們渲染的像素是離散的,所以如何判斷對應(yīng)關(guān)系?開發(fā)一個算法是非常困難的。如果算法錯誤,三角形之間會出現(xiàn)裂縫。如果我們做混合,重疊的三角形也會顯示出來。從另一方面說,必須保證渲染三角形代表的平面時,每像素只渲染一次。幸運的是,圖形硬件保證了這一切。
雖然,我們不必知道硬件如何決定某像素屬于某三角形,但還是有必要了解對一個單獨的像素,它會做些什么。概念上有三步:
(1)著色:像素著色指為像素計算顏色的過程。一般,像素先光照再霧化,像素著色的輸出值不但有RGB,還有alpha值表示透明,用于混合。
(2)測試:拒絕像素一般有三種測試方法。裁剪測試去除渲染窗口外的像素(假如做了完整的視錐測試則不必要),深度測試用z緩沖去除像素,alpha測試以alpha值為基礎(chǔ)去除像素。可以使用多種alpha測試,但最常見的是去除過分透明的像素(我們不希望這類像素寫入深入緩存)。
(3)寫入:如果像素通過了深度測試和alpha測試,則更新幀緩存和深度緩存。深度緩存用新值替代舊值即可,幀緩存復(fù)雜一些,如果不需要混合,則用新的像素顏色替代舊的值;否則就進(jìn)行新舊顏色的混合,依據(jù)alpha值決定它們各自的貢獻(xiàn)。根據(jù)不同的圖形硬件,也可執(zhí)行一些其他運算,如加、減。乘。