天天看點

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

歡迎大家圍觀評論,我每天抽出一個小時以上邊看邊翻譯,絕不太監。當然有翻譯不好或者了解不到位的地方,歡迎大家拍磚!!!

第二章 渲染管線

本章描述實時渲染系統中最核心的部分,稱之為渲染管線,簡稱為管線。渲染管線最主要的功能是根據虛拟的相機、三維對象、光源、着色公式和紋理等資訊來渲染一張二維圖像。渲染管線是實時渲染的背後工具。如圖2.1描述了如何使用渲染管線。二維圖像中模型的位置和形狀是由很多因素決定的,比如說模型的幾何形狀,環境的特點和相機的位置。模型的外觀受到材質、光源、紋理和着色模型等影響。

接下來會讨論渲染管線的各個階段,主要關注于每個階段的功能而不是實作。實作細節留在以後讨論,很多細節程式員不能控制。例如,畫出一條直線需要注意頂點格式,顔色,樣式甚至景深效果,但是不需要關注是使用Bresenham直線算法還是對稱Symmetric double-setp算法。管線中很多階段是由不可程式設計的硬體實作,是以不可能優化這些硬體實作的階段。基本的畫圖和填充算法可參見Rogers[1077]。由于我們對底層硬體的控制力很弱,是以好的算法和程式設計方式才能渲染的又好又快。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.1 左邊的圖像,虛拟的相機位于金字塔的頂部(由四條直線确定)。隻有在視晶體内部的圖元才會被渲染。當采用透視投影的時候,視晶體是一個截頭錐體,一個截面為矩形的截頭錐體。右邊的圖像為相機所看到的圖像。紅色的環狀線圈沒有渲染,因為它落在視晶體外部。另外藍色的棱柱被視晶體的上平面裁剪過。

2.1 架構

在真實世界當中,管線的概念置身于多種形式當中,比如說工廠的裝配線到上山的纜車。這個概念也應用到圖形渲染當中。這就意味着,管線的整體速度由最慢的階段所決定而不是其他階段有多快。

理論上來說,一個非管線系統改造成為由n個階段所組成的管線系統後,會帶來n倍加速效果。這就是使用管線的最主要原因。例如,一個上山纜車隻有一個椅子的效率是不夠的,增加更多的椅子意味着運送人員的速度成比的增加。雖然管線的每個階段是并行的執行,但是整個系統還是受限于最慢的階段。例如,汽車裝配線上,方向盤的安裝需要三分鐘而其他階段隻需要兩分鐘,那麼裝配線上所能達到的最佳速度是三分鐘每輛,其他階段需要停工一分鐘等待方向盤的安裝。對于這個管線系統來說,方向盤的安裝是瓶頸,因為它決定着整個生産系統的速度。

計算機實時圖形渲染也使用這種管線結構。可以将實時渲染管線大緻的分為三個階段,應用、幾何和光栅化,如圖2.2。管線結構是實時渲染的核心,是我們接下來幾章要讨論的基礎。每個階段也可能是一個管線結構,也就意味着每個階段也可能擁有多個子階段。我們區分概念階段(應用、幾何和光栅化)、功能階段和管線階段。功能階段需要執行特定的操作,但是沒有規定如何實作這一操作。另一方面,各個管線階段是同時執行的。這些管線階段需要并行才能滿足性能要求。例如,幾何階段可分為五個功能階段,但是這些功能階段都是圖形系統的具體實作。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.2 渲染管線的最基本結構,由三個階段組成:應用,幾何和光栅化。每個階段可能又是一個管線,例如圖中所示的幾何階段,或者如圖中所示的光栅化階段,其中的多個子階段又可以并行。圖中的應用階段也可以管線化或者并行化。

最慢的管線階段決定着系統的渲染速度,圖像的重新整理率。可以用每秒幀數(fps)來表示,就是每秒能渲染的圖像的數量。也可以用使用Hz來表示,表示更新頻率。每個系統渲染出圖像所耗的時間各有不同,依賴于渲染出這張圖像的計算複雜度。FPS用來表示特定圖像的渲染的頻率,或者表示一段時間内平均的頻率。Hz多為硬體中使用,例如設定為固定不變的顯示頻率。因為我們在和渲染管線打交道,不能增加一些時間來達到固定頻率,渲染頻率是由資料經過整個管線的時間來決定的。當然,使用渲染管線結構的結果是可以讓這些不同的階段并行執行。如果我們能夠定位到瓶頸,例如管線中最慢的階段,并且測量出資料通過此階段所花費的時間,我們就能計算出渲染頻率。例如,瓶頸階段需要花費20ms才能完成,那麼渲染速度就是1/0.02=50Hz。當然,隻有顯示裝置能在此頻率上工作,這個結果才成立,不然真實的頻率還要低一些。在有的管線中,使用術語throughput來替代渲染速度。

例子:渲染速度。假設顯示裝置的最大更新頻率為60Hz,是整個渲染管線的瓶頸。某一階段需要花費62.5ms,那麼渲染速度計算如下。首先忽略顯示裝置,可以計算出最大渲染速度為1/0.0625=16fps。第二,調整渲染頻率以适應顯示器的頻率:顯示器60Hz的更新頻率也就意味着渲染頻率可以是60Hz,60/2=30Hz,60/3=20Hz,60/4=15Hz,60/5=12Hz。(因為顯示頻率必須是渲染頻率的倍數)這也就意味着整個系統的頻率隻能是15Hz,因為這是顯示裝置可以接受的最大的頻率(渲染頻率小于16的情況下)。

從名字可知,應用階段是由運作在CPU上的應用程式所驅動的。CPU包含多核,可以并行的處理多線程。這使得CPU可以有效的運作大量的任務,這些任務屬于應用階段。這些運作在CPU上的任務包括碰撞檢測、全局加速算法、動畫、實體模拟等等。下一階段是幾何階段,處理變換、投影等。這一階段機選哪些東西需要被渲染,以及在什麼地方渲染。幾何階段基本上在GPU上運作,GPU包含許多可程式設計單元和固定單元。最後,光栅化階段根據上一階段的資料以及逐渲染的計算渲染出最終的圖像。光栅化階段完全是由GPU實作的。接下來的三小結會逐一讨論這些階段以及其中的資訊。更多關于GPU如何處理的資訊會在第三章介紹。

2.2 應用階段

應用階段工作在CPU上,是以開發者可以控制這一階段的所有細節。開發者可以決定這一階段的所有實作并随時可以修改以達到更好的性能。當然這些修改也會影響到後來的階段。例如,應用階段的算法或者設定可能會減少需要渲染的三角形的數量。

應用階段的最後,需要渲染的幾何體被傳遞到幾何階段。這傳遞過去的東西被稱為圖元,例如點、線、三角形,這些圖元有可能最終顯示到螢幕上。這是應用階段最重要的任務。

由軟體實作的應用階段的問題可能在于,它不能像幾何和光栅化階段那樣劃分為多個子階段。但是,為了提高性能,這一階段經常是由多核并行執行。在CPU設計中,這稱之為超标量體系,因為多個處理器可以在同時處理同一個階段。15.5展示課多種使用多處理的方法。

碰撞檢測經常在應用階段實作。如果檢測到兩個物體碰撞,需要将回報送到碰撞的物體,也會回報到輸出裝置上。[2016/06/06]應用階段也會處理來自其他方面的輸入資訊,例如鍵盤、滑鼠和頭盔等。依據這些輸入可能有各種不同的回報。應用階段還包括紋理動畫,和模型動畫,還有一些其他階段不處理的計算。加速算法,例如分層的視晶體裁剪(詳見14章)也會在應用階段實作。

2.3 幾何階段

幾何階段主要是逐圖元和逐頂點的操作。這一階段也細分為如下功能階段:模型視圖變換、頂點着色、投影、裁剪和螢幕映射(如圖2.3)。注意,依賴于實作不用,每個功能階段不一定等于一個管線階段。有的例子中,多個連續的功能階段組成一個管線階段(此管線階段和其他管線階段并行執行)。在其他例子中,一個功能階段可以細分為過個更小的管線階段。[2016/06/09]

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.3 幾何階段細分為多個功能階段

在某些極端的情況下,所有的渲染管線階段都以軟體的方式運作在單個處理器上,可以認為全部的管線隻包含一個管線階段。在獨立的圖形加速晶片和主機闆出現之前,就是以隻包含一個管線階段的方式來渲染圖形。還有一些極端情況,每個功能階段可以細分為更小的管線階段,每一個管線階段可以在指定的處理單元上運作。

2.3.1 模型視圖變換

在将模型渲染到螢幕的途中,模型需要變換到幾個不同的空間或者坐标系統中。開始,模型處在自己的模型空間中,這意味着沒有經過任何變換。每個模型有一個與之相關的模型變換,這個模型變換将模型變換到指定的位置和朝向。單個模型可能由多個模型變換與之相連。這就允許同一個模型有着多份拷貝(也叫執行個體),每個拷貝有着自己的位置方向和尺寸,進而不需要複制模型的幾何資訊。

模型的頂點和法線經過模型變換。模型本身的坐标系被稱之為模型坐标系,經過模型變換之後,模型位于世界坐标系或者世界空間之中。世界空間是唯一的,所有的模型經過自己的模型變換之後,都位于這個唯一的世界空間中。

正如前面提到的一樣,隻有相機(或者觀察者)能看到的模型才會渲染。相機位于世界空間之中,有着自己的位置和朝向。為了實施投影和裁剪,相機和所有的模型都會經過視圖變換。

模型變換和視圖變換是兩種操作,模型變換将物體從模型空間變換到世界空間中。視圖變換将模型從世界空間變換到視圖空間(相機為原點的空間)。視圖變換的目的在于,将相機置于原點,朝向某一觀察方向,這個觀察方向為-z軸,朝上的方向為y軸,x軸指向右邊(右手坐标系)。經過視圖變換之後實際的位置和方向依賴于底層的API。剛才描述的這個空間(坐标系)稱之為相機空間或者眼空間。視圖變換的結果如圖2.4所示

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

2.4 左邊的示例,相機置于使用者想要的位置,右邊的示例,視圖變換将相機置于原點,朝向-z軸。這麼做是便于裁剪和投影操作簡單快速的完成。灰色的區域稱之為視晶體。這裡假設是透視投影,因為視晶體是一個截頭錐體。

2.3.2 頂點着色

為了産生真實的場景,渲染模型的形狀和位置是不夠的,外觀也需要被很好的渲染。為了實作這些渲染,需要引入模型的材質和在燈光。材質和燈光有無數種方法來模仿,從簡單的顔色到

精心描述的實體方法。

決定材質在燈光下的效果的操作稱之為着色。需要在模型的每個頂點上計算着色等式以等到最終的結果。通常而言,有些計算是在幾何階段中逐頂點進行,另外的在光栅化階段逐像素進行。大量的材質資訊存儲在頂點上,比如頂點位置、法線、顔色和其他着色等式所需的參數。頂點着色的結果(可能是顔色、向量、紋理坐标和其他類型的着色資料)會送到光栅化階段進行插值。

着色計算通常是在世界坐标系中進行。實際中,為了友善,相關的實體(相機和光源)會被變換到其他空間中(例如模型和視圖空間),然後在此空間中進行計算。這麼做是可行的,因為光源、相機和模型之間的關系(着色計算當中的關系)在同一坐标系下保持不變。

着色會在本書中更深入的讨論,詳見第三章和第五章。

2.3.3 投影

經過頂點着色之後,接下來進行的是投影,投影是将視晶體轉換為一個标準的視晶體(也稱之為規範化視晶體) {(x,y,z)|−1<x,y,z<1} 。投影分為兩類,正交投影和透視投影。如圖2.5所示,左邊是正交投影,右邊是透視投影。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.5 左邊的是正交投影,也稱之為平行投影。右邊的是透視投影。

正交投影的視晶體是一個長方體,正交投影将這個視晶體變換為一個機關立方體。正交投影的結果是平行的線任然平行。這種變換是位移和縮放的結合體。

透視投影要稍微複雜一點。這種投影,離相機越遠的物體經過投影後會越小。經過透視投影,平行的直線在遠方會相交。透視投影模仿的是我們對物體的感覺。幾何上,這種視晶體稱之為截頭錐體,隻一個被截取一部分,且截口為矩形的金字塔。這種截頭椎體最後也會被變換到機關立方體。正交和透視投影的變換都可以用一個4x4矩陣來表示,經過這類變換後,模型位于标準裝置坐标系中。

盡管這些矩陣将模型從一個空間變換到另外一個,但還是被稱之為投影,這是因為顯示的圖像并不保持z值。其實是,将模型由三維投影到二維。

2.3.4 裁剪

隻有圖元完全或者部分在視晶體内,才需要傳送到光栅化階段,最後顯示在螢幕上。完全在視晶體内部的圖元會按部就班的傳送到下一個階段。圖元完全在視晶體外部不會傳送到下一階段,因為他們不會被渲染。那些部分在視晶體内的圖元會被裁剪。例如,一條直線,一個頂點在視晶體内部,而另一個在外部,那個在外部的頂點會被直線和視晶體的交點所取代。使用投影矩陣意味着變換後的圖元需要被标準立方體裁剪。[2016/06/11]在裁剪之前進行視圖和投影變換的原因是保持裁剪問題一緻,圖元始終是被标準立方體裁剪。裁剪過程如圖2.6所示。除了視晶體的六個裁剪面之外,使用者還可以定義額外的裁剪平面來屏蔽不需要的對象。不像幾何階段的操作是由可程式設計單元完成,裁剪階段(後來的螢幕映射)是由固定的硬體單元來完成。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

2.6 經過投影變換,隻有在标準立方體内部的圖元(相應也在視晶體内部)才需要進行接下來的處理。是以在标準立方體之外的圖元會被丢棄,之内的圖元會完整儲存。如果圖元和标準立方體相交,需要進行裁剪,會産生新的頂點而老的頂點會被丢棄。

2.3.5 螢幕映射

隻有裁剪後在視晶體之内的圖元才會被傳送到螢幕映射階段,這時候圖元的坐标還是三維的。x和y坐标會形成最終的螢幕坐标。螢幕坐标加上z坐标稱之為視窗坐标。假設場景渲染到視窗點 (x1,y1) 和點 (x2,y2) 之間的區域。這種螢幕映射使用縮放操作來完成。z坐标不會受到螢幕映射的影響。經過映射之後,x和y坐标位于螢幕坐标系。z坐标 (−1≤z≤1) 也會同時傳送到光栅化階段。[2016/06/12]螢幕映射過程詳見圖2.7。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.7 經過投影變換之後,圖元位于标準立方體内,螢幕映射将是将圖元最終映射到螢幕上。

很多人對浮點數的坐标如何關聯到像素點感到混亂。DirectX9以及其之前的版本認為坐标0.0位于像素點的中心位置,也就意味着像素[0,9]包含實際區間[-0.5,9.5)。還有一種表示方法,認為最左邊像素的最左位置為坐标0.0。OpenGL和DirectX10及其後續版本使用後面這種表示方法。那麼,像素[0,9]包含實際區間[0.0,10.0)。簡單的轉換如下:

d=floor(c)(2.1)

c=d+0.5(2.2)

其中d表示像素的索引,是離散的整數,c表示在像素點内的連續的浮點數。

關于像素位置的布局,所有的API中像素的位置都是從左向右增長,但是像素的原點位于螢幕上方還是底部各有不同。OpenGL喜歡使用笛卡爾坐标系,左下角被認為是像素原點,而DirectX将左上角定義為像素原點。兩種方式各有緣由。例如,OpenGL中原點(0,0)位于圖像的左下角,而DirectX中原點位于左上角。DirectX使用這種方式原因在于,很多場景是至上而下的,例如,微軟的視窗也使用這種坐标系,我們的閱讀方式也是至上而下的,很多圖像格式都是以這種方式存放在緩存當中的(例如bmp格式)。當我們需要從一個API移植到另一個的時候,需要考慮這兩者之間的差異。

2.4 光栅化階段

光栅化的目标是利用經過變換和投影之後的頂點資料(及其從幾何階段帶來的着色資料),計算出對象的每個像素的顔色。這個過程稱之為光栅化或者掃描轉換,這個過程将螢幕空間中的二維頂點(包含z值,也就是深度值,和其他的着色資訊)轉化螢幕上的一個一個的二維點。

類似于幾何階段,光栅化階段也可以分為過個功能階段:設定三角形,周遊三角形,像素着色和合并,如圖2.8所示:

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.8 光栅化階段細分為一個擁有多個功能階段的流水線

2.4.1 設定三角形

在這個階段,會計算三角形的差異資料和其他資料。這些資料用于掃描轉換,也會對這些由幾何階段産生的着色資料進行插值。這些操作是由專門的固定硬體完成的。

2.4.2 周遊三角形

這一階段找到三角形所覆寫的所有像素,并為每一個像素産生一個片源(fragment)。尋找位于三角形内部的像素的操作稱之為周遊三角形或者掃描轉換。所有的産生的片源屬性是根據所在三角形的頂點的屬性插值而得到的。這些片源屬性包括片源的深度和其他從幾何階段送過來的着色資料。

2.4.3 像素着色

所有的逐像素着色計算都在這個階段完成,使用經過插值的着色資料作為資料源。這個階段的輸出主要是顔色。不像設定三角形和周遊三角形有專門的硬體來完成,像素着色是由可程式設計的GPU單元完成。很多技術可以在此階段使用,最重要的一個就是紋理貼圖。紋理貼圖詳見第6章。簡單介紹,紋理貼圖就是将一張圖像粘貼在物體表面。此過程詳見圖2.9。這個圖像可能是一維、二維或者是三維,最常見的是二維紋理。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

圖2.9 左上方是一個無貼圖的龍模型。左下角就是将紋理粘貼到龍模型上。[2016/06/13]

2.4.4 合并

每個像素的顔色資訊存儲在顔色緩存中(color buffer),這個緩存是一個顔色值(擁有紅綠藍三個分量)的二維矩陣。合并操作負責合并像素着色所産生的片源的顔色與目前顔色緩存中的顔色。不同于像素着色,這一階段的GPU單元不是完全可程式設計的。但是也是可以高度定制化的,産生出各種效果。

合并階段也負責解決可見性問題。這就意味着,當渲染整個場景時,隻有從相機方向能看到的圖元才能留到顔色緩存中。很多硬體使用Z-buffer(depth buffer)算法。Z-buffer是一個和顔色緩存大小相同的緩存,其中每個像素存儲的是從相機方向看過去最近圖元(應該是片源)的Z值。這就意味着當一個圖元(應該是片源)渲染到一個像素上時,這個圖元(應該是片源)的Z值會被計算出來,圖元(應該是片源)的Z值和Z-buffer當中對應像素的Z值做比較。如果圖元(應該是片源)的Z值小于Z-buffer中的值,意味着圖元(應該是片源)離相機更近。是以使用圖元(應該是片源)的Z值和圖元的顔色來更新Z-buffer和顔色緩存。如果圖元(應該是片源)的Z值比Z-buffer中的值大,那麼圖元(應該是片源)的顔色值和Z值會被丢棄。Z-buffer算法十分簡單,複雜度為 O(n) (n是渲染圖元的數量),對任意的圖元都有效(隻要能計算出它的Z值)。還注意這個算法運作基本上所有的圖元以任意順序渲染,這也是它為什麼這麼流行的原因。然而,半透明的圖元不能以任意順序渲染。他必須要在不透明物體渲染之後再渲染,以從後到前的順序。這是Z-buffer算法的主要缺點之一。

我們注意到顔色緩存存儲顔色,Z-buffer存儲z值。還有其他和片源資訊相關的通道和緩存。Alpha通道也很顔色緩存相關,存儲的是每個像素的透明值(詳見5.7節)。針對片源的Alpha測試工作在深度測試之前。片源的Alpha值和和一個指定的值比較。如果片源沒通過Alpha測試,它就不會通過接下來的處理。Alpha測試用來保證全透明的片源不會影響到Z-buffer。

模闆緩存是另一種緩存用來記錄渲染後圖元的位置。模闆緩存單像素包含8位(一個位元組)。模闆緩存有很多功能,可以用來控制渲染到顔色緩存和Z-buffer中的值。例如,一個填充的圓渲染到模闆緩存中。可以利用目标緩存實作一個效果,所有片源隻有在圓之内才渲染。目标緩存是一個強有力的工具以實作某些特殊的效果。所有的位于渲染管線末尾中的這些操作,稱之為光栅操作(ROP)或者混合操作。

幀緩存通常指的是所有的緩存,有時候也單單指的是顔色緩存和Z-buffer的集合。1990,Haeberili和Akeley展現了另外一種buffer,稱之為累計buffer(accumulation buffer)。這種緩存中,可以使用一組方法來累加像素顔色。例如,一組關于對象運動的圖像可以累加然後求平均,以達到運動模糊的效果。還可以用其實作景深、反走樣和軟陰影等等。

當圖元通過光栅化階段,那些位于相機視覺範圍之内的片源将會在螢幕上顯示。螢幕上顯示的是顔色緩存中的值。為了避免使用者看到渲染過程中的顔色緩存,會使用雙緩存。這意味着場景的渲染并不是在目前顯示的緩存中進行的,而是在後備緩存中進行的。一旦場景在後備緩存中渲染完成,後備緩存會和目前緩存交換。這個交換操作發生在垂直掃描之間,這期間有足夠的時間完成交換。

2.5 貫穿渲染管線

點、線和三角形是最基礎的圖元,所有的模型都由這些基礎圖元建構。比方一個互動式的CAD應用,使用者檢查一個手機的設計。我們順着整個流水線,包括三部分:應用、幾何和光栅化。整個場景通過透視投影到螢幕的視窗中。[2016/06/14]這個例子中,手機模型包括基本圖元線(手機的邊緣)和三角形(手機表面)。有些圖元三角形被貼上二維圖像,以此表示鍵盤和螢幕。這個例子中,所有的着色操作在幾何階段完成,除了光栅化階段的紋理貼圖。

應用

CAD應用運作使用者選擇和移動模型的部件。例如,使用者選擇手機的最上面的部件(蓋子),然後點選滑鼠來打開手機。應用階段将使用者的操作轉換對應的旋轉矩陣,當矩陣作用到蓋子上,正确的渲染結果就出來了。另一個例子,相機随着定義好的路徑移動以全方位的展現手機效果。相機的各個參數,例如位置和朝向必須在應用階段實時更新。每一幀開始繪制前,應用階段為幾何階段設定好相機位置、光源和模型的圖元等資訊。

幾何

由應用階段傳過來的視圖矩陣,加上每個對象都有自己的模型矩陣,儲存着模型的位置和朝向資訊。對每個傳到幾何階段的對象,這兩個矩陣相乘變為一個矩陣。在幾何階段,對象的頂點和法線都經由這個級聯的矩陣(視圖矩陣乘以模型矩陣)變換,進而将對象變換到視圖空間(眼空間,相機空間)。然後使用材質和光源等資訊,計算每個頂點的着色資訊。然後進行投影變換,将對象變變換到标準的立方體空間内,這個空間表示眼睛所見的空間。所有在标準立方體之外的圖元都會被丢棄。所有和标準立方體相交的圖元都會被裁剪,得到處于标準立方體以内的新圖元。然後所有的圖元頂點映射到螢幕空間中。經過上述操作之後,所有的圖中繼資料送到光栅化階段。

光栅化

這個階段,所有的圖元被光栅化,最終變成 一個一個的像素點。所有的可見的圖元進入光栅化階段,等待處理。有紋理與之相關的圖元會進行紋理貼圖。使用Z-buffer處理可見性問題,與之相關的還有Alpha測試和模闆測試。所有的圖元依次處理,最終變成螢幕上的圖像。

Real-Time Rendering 翻譯 2.渲染管線第二章 渲染管線

結論

這套渲染管線是API和圖形硬體數十年朝着實時渲染進化的結果。注意這不是唯一可行的渲染管線,離線渲染的渲染管線有着不同的進化路徑。電影級别的渲染産品使用微多邊形(micropolygon)渲染管線。學術研究和predictive rendering應用經常使用光線追蹤,比如說建築可視化。

多年以來,開發者隻能利用API來控制固定管線來使用上述功能。稱之為固定管線,是因為圖形硬體實作了上述功能,不能通過可程式設計的方式靈活使用。每個階段可以設定渲染管線的功能,例如Z-buffer測試可以打開或者關閉,但是沒有任何辦法通過程式設計方式來控制每個階段所開啟的功能。最新關于固定管線的例子的時Nintendo’s Wii。可程式設計GPU可以控制每個子階段的具體操作。學習固定管線隻是引入最基本的概念,但是最新的開發都是使用可程式設計GPU。本書假設GPU是可程式設計的,這是使用GPU的最先進方式。