這一章將介紹的是被認為是實時圖形學核心部件的圖形渲染管線,亦可簡稱為管線。管線的主要功能是生成或渲染二維圖像、三維物體、光源、着色方程式、紋理等。渲染管線是實時渲染的底層實現。管線的作用如圖2.1所示。圖片中的對象所處位置及外形由其幾何數據所處環境的特性以及攝像機的位置共同決定對象的外表是受到材質屬性、光源、紋理及着色模形所影響。
渲染管線進行渲染的不同階段會在下面被解析和討論。這將聚焦於各階段所負責的功能而非其實現。實現的細節要么留在最后一章,要么是程序員不能控制的元件。舉個例子,對於一個正使用直線的人來說,他最在意的是這條線的特性,例如其頂點數據格式、顏色、線型類型以及所謂深度提示是否可用,而非該線是使用Bresenham直線繪制算法或symmetric double-step算法繪制。這些渲染階段通常是實現在不可編程的硬件上,這使得對其實現進行優化和改進是不可能的。一些書例如Rogers的深入地介紹了基本的繪制和填充算法的細節,而我們對底層硬件、圖像生成的算法和代碼控制是有限的。
圖2.1 在左圖,一虛擬攝像機放置在棱椎的頂部(即四條線交匯處)。只有可視體內部的圖元會被渲染。因為圖像是以透視畫法渲染的(像這里的情況),可視體成一平截頭體,即一切去頂端的四棱椎。右圖展示了攝像機的所見。注意到紅色的圓環體因為其位置在可視平截頭體外,故未被渲染同樣的是左圖的藍色螺旋柱體亦被平截頭體頂平面裁剪掉。
2.1 架構
在現實世界,管線這個概念以各種不同方式出現,從工廠的組裝流水線到運送滑雪者的上山吊車。它同樣出現在圖形渲染領域中一條管線由多個階段、步驟組成。例如油汽管線,在第一階段的石油不能在第二階段石油進入第三階段前進入第二階段,這預示着管線的速度取決於最慢的階段,無論其它階段有多快。
理論上,一個非管線系統若分成幾條管線階段,可給予n的加速因子。在運行效率上的提升是應用管線的主要原因。例如一雪橇吊車只有一張椅子是低效率的;增加更多的椅子可成比例地加速運送滑雪者上山。管線階段是在汽車組裝流水線上,方向盤的裝配階段需要3分鍾,而其它階段需要兩分鍾,則能達到的最佳汽車組裝速率為3分鍾一輛;其它階段必須閑置1分鍾去等待方向盤組裝階段的完成。針對這條獨特的管線,方向盤組裝階段成為其瓶頸,這是因為它決定了整條管線的生產效率。
圖2.2 渲染管線的基本構成由3個階段組成:應用程序,幾何及光柵。每一個階段本身都有可能是一條管線,就如圖所示的幾何階段;或者一個部分並行的階段,就如圖所示的光珊階段。在圖中,應用程序階段是單一的過程,但亦有可能是管線化或並行化。
在實時計算機圖形中,亦存在同樣的管線設計。如圖2.2,實時渲染管線可粗略分為三個概念性的階段——應用程序,幾何及光珊。這個結構是渲染管線的核心機制,應用在實時計算機圖形學應用程序中。因此接下來的章節將對其作基礎的精要的論述。每一個階段通常本身也是一條管線,這意味着它由一些子階段組成。我們對概念性的階段(應用程序,幾何和光柵),功能性階段及管線階段進行區分。功能性的階段規定了運行某個任務,但並未指定任務在管線中如何執行。而管線階段則是與其它管線階段並行執行。為了高性能的需要,管線階段可能並行執行。例如幾何階段可分為5個功能階段,但它在圖形系統的實現是取決其在管線階段的划分。一個給定的實現可能將兩個功能階段聯合在一個管線階段中實現,同時一個時間消耗比較大的功能階段,亦可分割為一系列管線階段,甚至對其並行化。
最慢的管線階段決定了渲染速度、圖像的更新速率。這個對其速度可以以幀率(fps)表達,這是每秒渲染圖像的數目。它亦可以以赫茲表示,即一秒的多少分之一的記號,是更新的頻率。用於應用程序生成圖片的時間通常是各種各樣的,取決於每幀圖片計算的復雜度。幀率所表達的要么是某一幀的速率,要么是一段時間內的平均速率。赫茲是用硬件方面,例如顯示,這是一個固定的速率。因為這涉及管線,將其處理所有需渲染數據所用時間簡單相加是不足夠的。當然,這是管線構造所導致的結果,它讓各階段可並行運行。如果我們能定位出瓶頸,即管線中最慢的階段所在,並測量出它處理數據所需時間,那樣的話,我們可能測出渲染速度。假設,瓶頸階段需要20微秒去運行;渲染速度為1/0.020即50Hz。但這僅當輸出設備能以這個速度更新時才成立;否則的話,真正的輸出幀率將更慢。在管線的背景下,吞吐量比渲染速度更能說明一切。
例子:渲染速度。假設我們設備的最大更新頻率為60Hz,並且渲染管線的瓶頸已找到,該階段需時62.5微秒運行。渲染速度的計算如下。首先,忽略輸出設備,得到最大渲染速度為1/0.0625=16fps。接着,調整輸出設備的頻率:60Hz意味着渲染速度可以是60Hx,60/2=30Hz,60/3=20Hz,60/4=15Hz,60/5=12Hz等5種速度。這意味着我們可以預期渲染速度為15Hz,這是因為輸出設備所能達到的最大持續輸出幀率是少於16fps
正如名字所暗示的,應用程序階段是由應用程序驅動並且其由運行在通用CPU的軟件代碼所實現。這些中央處理器通常包含多個內核並且可並行運行多個線程。這使得中央處理器能有效處理應用程序階段各種大相徑庭的任務。這些傳統上運行於 中央處理器的任務包括碰撞檢測,全局加速算法,動畫,物理模擬等各種,這取決於應用程序的類型。接下來的是幾何階段,處理幾何變換,投影等。這個階段計算繪制什么,如何繪制及在那里繪制。幾何階段通常運行在圖形處理器(GPU)中。這類處理器色含多個可編程內核和一些固定操作的硬件。最后在光柵階段應用前階段產生的數據繪制(渲染)圖片,並且進行逐象素的計算。整個光柵階段都在GPU上運行。這些階段及其內部管線將在接下來的三章被討論。更多的關於圖形處理器處理這些階段的細節見第三章。
2.2 應用程序階段
因為應用程序階段運行於CPU上,開發者可以對其全面掌控。因些,開發者可完全決定其實現並在之后對其修改以提高運行效率。在這里的改變亦能影響后面階段的運行效率。但如一些應用程序階的算法和設定可能減少將被渲染的多邊形。
在應用程序階段的最后步驟,將被渲染的幾何體會輸入到幾何階段。這些幾何體都是繪制圖元,例如點、線和三角形等最后將輸出到屏幕(或者被輸出設備所用)。這是應用程序階段中最重要的任務。
這階段的實現是以軟件為基礎,這導致到不像幾何和光珊階段那樣,被析分為多個子階段。但是為了提升運行效率,該階段經常並行運行在多個處理器核心上。在中央處理器設計方面說,這叫超標量體系結構,因為它能夠在同一階段同一時間內運行數個運算步驟。15.5節展示各種應用多核處理器的方法。
一通常在這階段實現的運算步驟是碰撞檢查。當一關於兩物體的碰撞檢測出來后,反應將會被生成並發送到碰撞的對象和力反饋設備上,應用程序階段亦是處理包括鍵 盤、鼠標、頭盔等設備輸入的地方。跟據不同的輸入,作出不同的反應。該階段的其它步驟包括紋理動畫或者一些不運行在其它階段的計算。一些加速算法,例如層次化視圖平截體裁剪(見第十四章)亦是在此處實現。
2.3 幾何階段
幾何階段負責了大多數逐多邊形和逐頂點的操作。該階段可進一步分割成下面的功能階段:模型和視圖的變換,頂點着色,投影,裁剪及屏幕映射(圖2.3)應注意的是,功能階段可能與管線階段相等,亦可不同。在某些場合下,一系列連續功能階段組合成一個單獨的管線階段(它與其它管線階段並行運行),在另外一些情況下,一個功能階段也可能被分割成多個更小的管線階段。
圖2.3 幾何階段細分一條管線的數個功能階段
例如,考慮一極端情況,整個渲染管線可能在單一一個處理器,以軟件實現,這樣的話你可以說整個管線由一個管線階段組成。當然,這就是在單獨的圖形加速芯片和顯卡出現前去生成圖形的方法。而另一個極端是,所有的功能階段都細分為更細小的管線階段,並且每個管線階可運行在指定的處理器核心元素。
2.3.1 模型及視圖變換
在成為屏幕上的圖象前,模型會被變換到多個空間或坐標系。在最初,模型處於它所擁有的模型空間,簡單的說是它未進行變換。每個模型都可與模型變換相關聯,以對其定位和定向。一個模型可與多個模型變換相關聯。這使得在沒有復制基本的幾何數據的情況下,可以有多個不同位置、朝向和大小的模型拷貝(或者說是實例)。
模型上的頂點和法何量會被模型變換所變換。對象的坐標系稱為模型坐標系,當應用了模型變換后,模型處於世界坐標系或世界空間。世界空間是唯一的,當模型完成其相應的模型變換后,所有的模型處於同一空間。
像前面所說的,只有攝像機(或觀察者)能看見的模型才會被渲染。攝像機處於世界空間,有方向及位置。為了進行投影和裁剪,攝像機和所有的模型會進行視圖變換。進行視圖變換的目的是將攝像機放置於坐標原點,並使其方向朝 Z軸負向,且Y軸指向上,X軸指向右。視圖變換后,實際位置和方向取決於應用程序接口(API)的實現。
圖2.4 在左圖中,攝像機的位置及朝向如用戶所設想。視圖變換重定位攝像機到原點,朝向沿Z軸負方向,如右圖所示。這個做法使得裁剪和投影更簡單和快速。淺灰色的區域是可視體。因為可視體是一平截頭體,可假定其為透視的,相同的方法可用於其它任何一種投影。
因此這個空間所描述的被叫作攝像機空間,或者更普遍的說,叫視角空間。圖2.4展示了一個視圖變換影響攝像機和模型的例子。所有的模型變換和視圖變換都由4×4矩形陣實現,這將是第四章的主題。
2.3.2 頂點着色
為了實現逼真的場景,僅渲染對象的形狀和位置是不足夠的,它們的外觀亦需要模擬。這些描述包括第每對象材質,以及光源照射對象產生的特效。模擬材質和光源的方法有很多種,包括從最簡單的顏色到精細的物理特性描述。
決定光和材質特效的操作稱為着色。它包括了計算不同點的着色方程。典型的某些這類的計算運行在幾何階段的模型頂點數組上,另外一些則運行在逐象素的光珊化階段。各類的材質數據,例如點所在位置,法向量,顏色或其它着色方程需用到的數值信息,可儲存在每個頂點中。頂點着色的結果(這可能是顏色,向量,紋理坐標或其它種類的着色數據)會被送進光珊化階段去插值。
着色階段通常被認為是發生在世界空間。在實踐中,有時則將相應的實體(例如攝像機和光源)變換到其它空間(例如模型或視覺空間)並在那運行計算更為方便。因為如果所有包含在着色計算中的對象均被變換到同一空間,則光源、攝像機和模型的相對關系是保留的。
關於着色更深入的討論將貫穿這本書,將在第三至五章中詳述。
2.3.3 投影
着色完成后,渲染系統開始進行投影,即將可視體轉換為一位於(-1,-1,-1)到(1,1,1)單位立方體。這個立方體叫做規則觀察體。有兩種常用的投影方法,即正投影(亦稱為平行投影)和透視投影。如圖2.5
圖2.5 左邊是正投影或者叫平行投影;右圖是透視投影。
正投影的可視體為則的正方體,投影將可視體轉為單位立方體。正投影主要的特性是變換后平行線依然保持平衡。這個變換是位置變換和比例變換的組合。
而透視投影有些復雜。在這種投影中,越遠離攝像機的物體,它在投影后看起來越小。更進一步來說,平行線將在地平線會聚。透視投影的變換是模擬人類感知物體的方式。在幾何方面說,可視體是平截頭體,即一截去頭部的以矩形為基底的四棱錐。這個平截頭體也被變換到單位立方體中。正投影和透視投影的變換都可由一4×4的矩陣構建,而在進行任一種變換后,模型被認為處於規格化設備坐標系。
雖然這些矩陣變換是從一個可視體變換到另一個,但它們仍被稱為投影,因為在完成顯示后,Z坐標不會再保存在圖片中。通過這樣的方法模型從三維空間投影到二維上。
2.3.4 裁剪
只有完全或部分處於可視體中的圖元才會被傳遞到光柵階段,該階段將在屏幕繪制這些圖元。完全處於可視體的圖元會直接傳遞到下一個階段。而在可視體外的圖元則因其無需被渲染而不會傳遞到下一階段。部分處於可視體內的圖元則需要裁剪。例如一個頂點在可視體外而另一個在可視體內的線段將被可視體裁剪,所以在外面的頂點將被一位於線段與可視體相交的頂點所代替。使用投影矩陣意味着圖元與單位立方體相裁剪。在裁剪之前進行視圖變換和投影變換的好處是使得裁剪問題比較一致;圖元總可被單位立方體裁剪。裁剪的過程如圖2.6所描述。作為六個裁剪平面的補充,用戶可定義額外的裁剪平面去剔除對象。在646頁的圖14.1通過一幅圖片展示了這種叫分割的呈現方式。不像前面的那些運行在可編程處理單元的幾何階段,裁剪階段(以及接下來的屏幕映射階段)通常是運行在固定操作的硬件上。
圖2.6 進行投影變換后,只有在單位立方體內的圖元(相應地處於可視體內的圖元)才需要后續的處理。因些,在單位立方體外的圖元將被丟棄而完全在內的圖元將被保留。與單位立方體相交的圖元會被單位立方體裁剪,新的頂點會生成而舊的會被丟棄。
2.3.5 屏幕映射
只有(被裁剪過的)在可視體里面的的圖元才會被傳遞到屏幕映射階段,在進入這階段時坐標仍然為三維的。圖元的X、Y坐標被變換到屏幕從標系中。屏幕坐標系與Z坐標一並為窗口坐標系。假設場景應渲染在一個最小角(X1Y1)最大角在(X2Y2)且X1<X2和Y1<Y2的窗體中。那么屏幕映射是首先進行平移隨后進行縮放操作。Z坐標不受映射的影響。新的X,Y坐標被稱為屏幕坐標。這些新的X、Y坐標與Z坐標(-1≤Z≤1)一道進入光柵階段。圖2.7描述了屏幕映射的過程。
圖2.7 圖元在投影變換后處於單位立方體內,而屏幕映射負責找屏幕上對應的坐標
一個困惑是整型和浮點型的點值如何與像素坐標(或紋理坐標)要關聯。DirecttX9和其之前版本的坐標系中,0.0是像素的中央,這意味着一片范圍為[0,9]的像素其所覆蓋的跨距為[-0.5,9.5]。Heckbert[520]給出了一個理論上更一致的策略。給出一水平的像素隊列並放在笛卡爾坐標中。最左邊的像素是浮點坐標的0.0。OpenGL一直以來都使用這種策略,而DirectX10及其后繼版本也使用這種方式。在中央的像素為0.5。所以一系列范圍為[0,9]的像素覆蓋的范圍為[0.0,10.0]。轉換公式如下:
d =floor(c) (2.1)
c = d+0.5 (2.2)
d是散化(整數)的像素索引,而c是連續的(浮點)像素值。
雖然所有的API的像素位置值均是由左到右遞增,但在關於零點像素位於最頂或最底邊緣的問題目上OpenGL與DirectX是不相一致的。OpenGL更傾向於笛卡爾坐標系,將左下角設定為數值最低的點,而DirectX有時定義左上角為這個點,這依賴於周邊環境。每個做法都有其背后的邏輯,關於它們的不同並沒有正確的回答。例如在OpenGL中,(0,0)位於圖片的左下角而在DirectX中位於圖片的左上角。DirectX采用如此做法的原因是屏幕上的很多的現象均從上到下的:微軟的窗體使用這種坐標系,我們閱讀的順序,多種圖片格式儲存緩沖數據的方式。這個不同點的存在對跨圖形API是很重要。
2.4 光柵階段
得到已變換及投影后的頂點及與之相關聯的着色數據(所有均來自幾何階段),光珊階段的目標是計算並設置像素的顏色。這個過程叫光珊化或掃描變換,即從二維頂點所處的屏幕空間(所有頂點都包含Z值即深度值,及各種與相關的着色信息)到屏幕上的像素的轉換。
圖2.8 光珊階段細分為功能階段的管線。
與幾何階段相似,該階段細分為幾個功能階段:三角形設定,三角形遍歷,色素着色和融合。
2.4.1 三角形建立
在這個階段微分及其它關於三角形表面的數據會被計算。這些數據用於掃描轉換及幾何階段產生的各種着色數據的插值。這個過程運行在專門為其設計的硬件上。
2.4.2 三角形遍歷
在這個階段像素將被檢查三解形是否覆蓋其中心,而對於與三角形部分重合的像素,其重合部分將生成片段(fragment)。找到哪些采樣點或像素在三角形中的過程通常叫三角形遍歷或掃描轉換。每個三角形片段的屬性均由三個三角形頂點的數據插值而生成(詳見第五章)。這些屬性包括片段的深度,以及來自幾何階段的着色數據。Akeley和Jermoluk [7]和Rigers[1077]提供了三角形遍歷方面的信息。
2.4.3 像素着色
所有逐像素的着色計算都在這階段進行,使用插值得來的着色數據作為輸入。最終的結果為一或種將被傳送到下一階段的顏色。不像三角形建立和遍歷那樣通常運行在專用的,電路半導體的階段,像素着色階段在可編程GPU內核上運行,大量的技術可以在這里使用,其中最重要的技術之一為紋理貼圖,關於紋理貼圖的詳細內容詳見第六章。簡單地說,紋理貼圖即將一圖像貼在物體上。圖2.9描述了這一過程。圖象可為一維、二維、三維的,而二維圖像更為普遍。
圖2.9 左上角為一沒有紋理貼圖的飛龍模型。左下角為一貼上圖像紋理的飛龍。
2.4.4 融合
每個像素的信息都儲存在顏色緩沖器中,這是一個顏色的矩陣列(每種顏色包含紅、綠和藍成分)。融合階段的任務是合成現儲存於緩沖器的由着色階段產生片段的顏色。不像其它着色階段,典型的運行該階段的GPU子單元並非完全可編程的。但它是高度可配置支持多種特效的。
這個階段也負責可見性的計算。這意味着當整個屏幕被渲染時,顏色緩沖器應包含從攝像機角度上可見的場景的圖元的顏色。對於圖形硬件,這些工作由Z緩存(亦叫深度緩存)算法去完成。Z緩存與顏色緩存的大小,格式相同,而對於每個像素,它儲存從攝像機到與攝像機最靠近的圖元的Z值。這意味着當圖元被渲染到某個像素時,其圖元的Z值會被計算並與Z緩存中相同像素的Z值相比較,如果新的Z值小於Z緩存中的值,那么將被渲染到這像素的圖元離攝像機比之前的圖元更近。那么那個像素的Z值和顏色會被即將繪制的圖元所更新。如果計算得出的Z值大於Z緩存中的值時,顏色緩存和Z緩存將被保留。Z緩存算法十分簡單,其收斂性為O(n)(n指將被渲染的圖元的數目),而且它對於所有可計算出每個(相關的)像素Z值的圖元都是有效的。並且注意到這個算法允許按任意順序繪制圖元,這也是其流行的原因。但半透明的圖元並不能按任意順序繪制。它們必須在所有不透明圖元繪制后再進行繪制,並且以由后到前的順序(見5.7節)。這是Z緩存算法的主要不足之處。
之前我們說過顏色緩存儲存每個像素點顏色而深度緩存儲存相應的Z值。然而還有另外一些管道和緩存可以過濾和捕獲片段的信息。alpha管道與顏色緩存相關並且儲存每個像素對應的透明值(見5.7節)。可選的alpha測試可在深度測試執行前在傳入片段上運行。片段的alpha值與參考值作某些特定的測試(如等於,大於等),如果片斷未能通過測試,它將不再進行進一步的處理。這種測試經常用於不影響深度緩存的全透明片段(見6.6節)。
模版緩存則是用於記錄所呈現圖元位置的離屏緩存。每個像素通常與占用8個位。圖元可使用各種方法渲染到模版緩存中,而緩存中的內容可以控制顏色緩存和Z緩存的渲染。舉個例子,假設一填充的圓形被繪制在模版緩存中。這可以與操作符聯合,這個操作符允許將后續的圖元僅在圓形所出現之處進行繪制。模版是一個強大的特效生成工具。所有這些功能在管線的盡頭叫做光柵操作(ROP)或混合操作。
幀緩存大體上組成了系統中的所有緩存,但有時用於指長顏色緩存和Z緩存組成的集合。在1990年,Haeberli和Akeley [474]提出了對幀緩存的另一種補充,叫累積緩存。在這種緩存中,圖像可通過一系列操作符進行累積。例如為了生成動態模糊一系列展示物體運動的圖像可被積累和平均。其它可生成的特效包括景深,反鋸齒,軟陰影等。
當圖元通過光珊階段處理,那些從攝像機視覺為可見的對象將被顯示到屏幕上。屏幕上顯示顏色緩存的內容。為了避免人們看到圖元在進行光柵化並傳送到屏幕,雙緩存技術被使用。這意味着場景的渲染離屏進行,在后台緩存中。一旦在后台緩存中完成場景的渲染,后台緩中的內容將與之前展示在屏幕的前台緩存內容交換。交換發生在垂直回掃時,這時候執行這個操作是安全的。
對更多關於不同緩存及緩沖方法的信息,參見5.6.2節及18.1節
2.5 穿越管線
點、線和三角形是渲染圖元,它們共同組成了模形或對象。想像一下一個交互的計算機輔助設計系統,用戶正在檢查一手機的設計。在此我們將跟隨這個模形穿越整個圖形管線,管線是由三個階段組成:應用程序、幾何和光柵。場景是以透視畫法繪制在屏幕上。在這個簡單的例子中,手機模型引入了直線段(用於展示邊緣部分)和三角形(用於展示表面)。一部分的三角形以二維圖像紋理貼圖去表現鍵盤和屏幕。在這個例子中,着色計算全部在幾何階段,除了發生在光珊階段的紋理貼圖。
應用程序階段
CAD應用程序允許用戶選擇和移動模型的一部分。例如,用戶可能選擇手機的頂部並移動鼠標翻開手機。應用階段必須將鼠標的移動轉換為相應的旋轉矩陣,然后務必確認渲染時那矩陣正確地應用於手機翻蓋上。另一個例子:播放一個攝像機沿預定路徑運動從不角度去展示手機的動畫。攝像機的參數,例如位置和視覺方向,必須由應用程序階段更新。對於被渲染的每一幀,應用程序階段將攝像機位置,光,和模型的圖元填入管線的下一個主要階段——幾何階段。
幾何階段
在應用程序階段,視圖矩陣已被計算好,與此同時的還有關於每個對像位置和朝向的模型矩陣。對於每個傳遞到幾何階段的對像,這兩個矩陣通相乘為一個矩陣。幾何階段對象的頂點、法何量被這個連接的矩陣轉換到視覺空間。然后使用材質和光源等屬性計算頂點的着色。投影被執行,將對像轉換到代表視覺可見的單元立方體空間。所有在單元立方體之外的圖元將被丟棄。所有與單元立方體相交的圖元將被裁剪以獲得一組完全處於單元立方體的圖元。然后將頂點映射到在屏幕的窗口上。在所有的逐多邊形操作執行完后,結果數據被傳遞到光柵階段——管線的最后一個主要階段。
光柵階段
在這個階段,所有圖元光珊化,轉換為窗體上的像素。每個對像上每條可見的線和三角面都通過光珊器進入屏幕空間,准備轉換。那些與紋理相關聯的三角面會應用上紋理(圖片)后再行繪制。可見性問題通過Z緩存算法解決,隨同的還有可選的alpha測試和模版測試。所有對像依次處理,而最后的圖像顯示在屏幕上。
結論
這樣管線是API和圖形硬件十年來以實時渲染應用程序為目標進行演化的結果。需要注意的是這個進化不僅在渲染管線上,線下渲染管線也以另一種路徑發展。電影產品的渲染通常使用微多邊形管線。學術研究和預測渲染(predictive rendering)應用,例如architectural pre-visualization使用到光線跟蹤渲染器(見9.8.2節)
在多年以前,應用開發者使用這里所描述的過程的唯一方法是使用圖形API所定義的固定功能管線。以固定功能管線去命名的原因是圖形硬件以一些不能靈活編程的單元實現。而管線的各部分可設置不同的狀態。Z緩存測試可以開啟或關閉,但無法通過程序控制不同階段中各功能的應用順序。最新近(很可能是最后)的固定功能機器例子是任天堂的Wii。可編程GPU使得它可以准確地決定管線中各種子階段進行什么運算。當關於固定功能管線的研究引入一些基本原理后,最新的發展則以可編程GPU為目標。在這本書的第三版這種可編程能力默認假定存在,因為它是利用GPU的現代方法。
進一步閱讀及資源
Blinn的《A trip down the graphics pipeline》是一本關於軟件渲染舊書,但它是一學習實現渲染管線實現巧妙方法的好資源。對於固定功能管線,古老(但仍時常更新)的《OpenGL編程指南》(又叫紅寶書)提供了關於固定功能管線及其使用的相應算法的透徹的描述。我們書本的網頁http://www.realtime rendering.com,給出了各種渲染引擎的鏈接。