【《Real-Time Rendering 3rd》 提煉總結】(二) 第二章 · 圖形渲染管線 The Graphics Rendering Pipeline
這篇文章是提煉總結計算機圖形學界「九陰真經總綱」一般存在的《Real-Time Rendering 3rd》系列文章的第二篇。將帶來RTR3第二章內容「Chapter 2 The Graphics Rendering Pipeline 圖形渲染管線」的總結、概括與提煉。
文章分為全文內容思維導圖、核心內容分章節提煉、本章內容提煉總結三個部分來呈現,其中:
- 文章的第一部分,「全文內容思維導圖」,分為「章節框架思維導圖」和「知識結構思維導圖」兩個部分。
- 文章的第二部分,「核心內容分節提煉」,是按原書章節順序分布的知識梳理。
- 而文章的第三部分「本章內容提煉總結」,則是更加精鍊,只提煉出關鍵信息的知識總結。
一、全文內容思維導圖
1.章節框架思維導圖
2.知識結構思維導圖
二、核心內容分節提煉
2.1 圖像渲染管線架構概述 Architecture
渲染管線的主要功能就是決定在給定虛擬相機、三維物體、光源、照明模式,以及紋理等諸多條件的情況下,生成或繪製一幅二維圖像的過程。對於實時渲染來說,渲染管線就是基礎。因此,我們可以說,渲染管線是實時渲染的底層工具。
圖2.1展示了使用渲染管線步驟。渲染出的圖像的位置、形狀是由它們的幾何形狀,環境特性,攝像機位置決定的。而物體的外觀由材質特性,光源,紋理和著色模型確定。
原書圖2.1 左圖中,相機放在棱椎的頂端(四條線段的交匯點),只有可視體內部的圖元會被渲染。
在概念上可以將圖形渲染管線分為三個階段:
- 應用程序階段(The Application Stage)
- 幾何階段(The Geometry Stage)
- 光柵化階段(The Rasterizer Stage)
如下圖:
原書圖2.2 繪製管線的基本結構包括3個階段:應用程序、幾何、光柵化。
幾個要點:
- 每個階段本身也可能是一條管線,如圖中的幾何階段所示。此外,還可以對有的階段進行全部或者部分的並行化處理,如圖中的光柵化階段。應用程序階段雖然是一個單獨的過程,但是依然可以對之進行管線化或者並行化處理。
- 最慢的管線階段決定繪製速度,即圖像的更新速度,這種速度一般用FPS來表示,也就是每秒繪製的圖像數量,或者用Hz來表示。
2.2 應用程序階段 The Application Stage
- 應用程序階段一般是圖形渲染管線概念上的第一個階段。應用程序階段是通過軟體方式來實現的階段,開發者能夠對該階段發生的情況進行完全控制,可以通過改變實現方法來改變實際性能。其他階段,他們全部或者部分建立在硬體基礎上,因此要改變實現過程會非常困難。
- 正因應用程序階段是軟體方式實現,因此不能像幾何和光柵化階段那樣繼續分為若干個子階段。但為了提高性能,該階段還是可以在幾個並行處理器上同時執行。在CPU設計上,稱這種形式為超標量體系(superscalar)結構,因為它可以在同一階段同一時間做不同的幾件事情。
- 應用程序階段通常實現的方法有碰撞檢測、加速演算法、輸入檢測,動畫,力反饋以及紋理動畫,變換模擬、幾何變形,以及一些不在其他階段執行的計算,如層次視錐裁剪等加速演算法就可以在這裡實現。
- 應用程序階段的主要任務:在應用程序階段的末端,將需要在屏幕上(具體形式取決於具體輸入設備)顯示出來繪製的幾何體(也就是繪製圖元,rendering primitives,如點、線、矩形等)輸入到繪製管線的下一個階段。
- 對於被渲染的每一幀,應用程序階段將攝像機位置,光照和模型的圖元輸出到管線的下一個主要階段——幾何階段。
2.3 幾何階段 The Geometry Stage
幾何階段主要負責大部分多邊形操作和頂點操作。可以將這個階段進一步劃分成如下幾個功能階段:
- 模型視點變換 Model & View Transform
- 頂點著色 Vertex Shading
- 投影 Projection
- 裁剪 Clipping
- 屏幕映射 Screen Mapping
如圖2.3所示。
原書圖2.3 幾何階段細分為的功能階段管線
需要注意:
- 根據具體實現,這些階段可以和管線階段等同,也可以不等同。在一些情況下,一系列連續的功能階段可以形成單個管線階段(和其他管線階段並行運行)。在另外情況下,一個功能階段可以劃分成其他更細小的管線階段。
- 幾何階段執行的是計算量非常高的任務,在只有一個光源的情況下,每個頂點大約需要100次左右的精確的浮點運算操作。
2.3.1 模型和視圖變換 Model and View Transform
- 在屏幕上的顯示過程中,模型通常需要變換到若干不同的空間或坐標系中。模型變換的變換對象一般是模型的頂點和法線。物體的坐標稱為模型坐標。世界空間是唯一的,所有的模型經過變換後都位於同一個空間中。
- 不難理解,應該僅對相機(或者視點)可以看到的模型進行繪製。而相機在世界空間中有一個位置方向,用來放置和校準相機。
- 為了便於投影和裁剪,必須對相機和所有的模型進行視點變換。變換的目的就是要把相機放在原點,然後進行視點校準,使其朝向Z軸負方向,y軸指向上方,x軸指向右邊。在視點變換後,實際位置和方向就依賴於當前的API。我們稱上述空間為相機空間或者觀察空間。
t下圖顯示了視點變換對相機和模型的影響。
原書圖2.4 在左圖中,攝像機根據用戶指定的位置進行放置和定位。在右圖中,視點變換從原點沿著Z軸負方向對相機重新定位,這樣可以使裁剪和投影操作更簡單、更快速。可視範圍是一個平截椎體,因此可以認為它是透視模式。
【總結】模型和視圖變換階段分為模型變換和視圖變換。模型變換的目的是將模型變換到適合渲染的空間當中,而視圖變換的目的是將攝像機放置於坐標原點,方便後續步驟的操作。
2.3.2 頂點著色 Vertex Shading
為了產生逼真的場景,渲染形狀和位置是遠遠不夠的,我們需要對物體的外觀進行建模。而物體經過建模,會得到對包括每個對象的材質,以及照射在對象上的任何光源的效果在內的一些描述。且光照和材質可以用任意數量的方式,從簡單的顏色描述到複雜的物理描述來模擬。
確定材質上的光照效果的這種操作被稱為著色(shading),著色過程涉及在對象上的各個點處計算著色方程(shading equation)。通常,這些計算中的一些在幾何階段期間在模型的頂點上執行(vertex shading),而其他計算可以在每像素光柵化(per-pixel rasterization)期間執行。可以在每個頂點處存儲各種材料數據,諸如點的位置,法線,顏色或計算著色方程所需的任何其它數字信息。頂點著色的結果(其可以是顏色,向量,紋理坐標或任何其他種類的陰著色數據)計算完成後,會被發送到光柵化階段以進行插值操作。
通常,著色計算通常認為是在世界空間中進行的。在實踐中,有時需要將相關實體(諸如相機和光源)轉換到一些其它空間(諸如模型或觀察空間)並在那裡執行計算,也可以得到正確的結果。
這是因為如果著色過程中所有的實體變換到了相同的空間,著色計算中需要的諸如光源,相機和模型之間的相對關係是不會變的。
【總結】頂點著色階段的目的在於確定模型上頂點處材質的光照效果。
2.3.3 投影 Projection
在光照處理之後,渲染系統就開始進行投影操作,即將視體變換到一個對角頂點分別是(-1,-1,-1)和(1,1,1)單位立方體(unit cube)內,這個單位立方體通常也被稱為規範立方體(Canonical View Volume,CVV)。
目前,主要有兩種投影方法,即:
- 正交投影(orthographic projection,或稱parallel projection)。
- 透視投影(perspective projection)。
如下圖所示。
兩種投影方式的主要異同點:
- 正交投影。正交投影的可視體通常是一個矩形,正交投影可以把這個視體變換為單位立方體。正交投影的主要特性是平行線在變換之後彼此之間仍然保持平行,這種變換是平移與縮放的組合。
- 透視投影。相比之下,透視投影比正交投影複雜一些。在這種投影中,越遠離攝像機的物體,它在投影后看起來越小。更進一步來說,平行線將在地平線處會聚。透視投影的變換其實就是模擬人類感知物體的方式。
- 正交投影和透視投影都可以通過4 x 4的矩陣來實現,在任何一種變換之後,都可以認為模型位於歸一化處理之後的設備坐標系中。
雖然這些矩陣變換是從一個可視體變換到另一個,但它們仍被稱為投影,因為在完成顯示後,Z坐標將不會再保存於的得到的投影圖片中。通過這樣的投影方法,就將模型從三維空間投影到了二維的空間中。
【總結】投影階段就是將模型從三維空間投射到了二維的空間中的過程。
2.3.4 裁剪 Clipping
只有當圖元完全或部分存在於視體(也就是上文的規範立方體,CVV)內部的時候,才需要將其發送到光柵化階段,這個階段可以把這些圖元在屏幕上繪製出來。
不難理解,一個圖元相對視體內部的位置,分為三種情況:完全位於內部、完全位於外部、部分位於內部。所以就要分情況進行處理:
- 當圖元完全位於視體內部,那麼它可以直接進行下一個階段。
- 當圖元完全位於視體外部,不會進入下一個階段,可直接丟棄,因為它們無需進行渲染。
- 當圖元部分位於視體內部,則需要對那些部分位於視體內的圖元進行裁剪處理。
對部分位於視體內部的圖元進行裁剪操作,這就是裁剪過程存在的意義。裁剪過程見下圖。
原書圖2.6 投影變換後,只對單位立方體內的圖元(相應的是視錐內可見圖元)繼續進行處理,因此,將單位立方體之外的圖元剔除掉,保留單位立方體內部的圖元,同時沿著單位立方體將與單位立方體相交的圖元裁剪掉,因此,就會產生新的圖元,同時捨棄舊的圖元。
【總結】裁剪階段的目的,就是對部分位於視體內部的圖元進行裁剪操作。
2.3.5 屏幕映射 Screen Mapping
只有在視體內部經過裁剪的圖元,以及之前完全位於視體內部的圖元,才可以進入到屏幕映射階段。進入到這個階段時,坐標仍然是三維的(但顯示狀態在經過投影階段後已經成了二維),每個圖元的x和y坐標變換到了屏幕坐標系中,屏幕坐標系連同z坐標一起稱為窗口坐標系。
假定在一個窗口裡對場景進行繪製,窗口的最小坐標為(x1,y1),最大坐標為(x2,y2),其中x1<x2,y1<y2。屏幕映射首先進行平移,隨後進行縮放,在映射過程中z坐標不受影響。新的x和y坐標稱為屏幕坐標系,與z坐標一起(-1≦ z ≦ 1)進入光柵化階段。如下圖:
原書圖2.8 經過投影變換,圖元全部位於單位立方體之內,而屏幕映射主要目的就是找到屏幕上對應的坐標
屏幕映射階段的一個常見困惑是整型和浮點型的點值如何與像素坐標(或紋理坐標)進行關聯。可以使用Heckbert[書後參考文獻第520篇]的策略,用一個轉換公式進行解決。
【總結】屏幕映射階段的主要目的,就是將之前步驟得到的坐標映射到對應的屏幕坐標繫上。
2.4 光柵化階段 The Rasterizer Stage
給定經過變換和投影之後的頂點,顏色以及紋理坐標(均來自於幾何階段),給每個像素(Pixel)正確配色,以便正確繪製整幅圖像。這個過個過程叫光珊化(rasterization)或掃描變換(scan conversion),即從二維頂點所處的屏幕空間(所有頂點都包含Z值即深度值,及各種與相關的著色信息)到屏幕上的像素的轉換。
與幾何階段相似,該階段細分為幾個功能階段:
- 三角形設定(Triangle Setup)階段
- 三角形遍歷(Triangle Traversal)階段
- 像素著色(Pixel Shading)階段
- 融合(Merging)階段
如下圖所示:
原書圖2.8 光柵化階段一般細分為三角形設定,三角形遍歷,像素著色和融合四個子階段。
2.4.1 三角形設定 Triangle Setup
三角形設定階段主要用來計算三角形表面的差異和三角形表面的其他相關數據。該數據主要用於掃描轉換(scan conversion),以及由幾何階段處理的各種著色數據的插值操作所用。 該過程在專門為其設計的硬體上執行。
2.4.2 三角形遍歷 Triangle Traversal
在三角形遍歷階段將進行逐像素檢查操作,檢查該像素處的像素中心是否由三角形覆蓋,而對於有三角形部分重合的像素,將在其重合部分生成片段(fragment)。
找到哪些採樣點或像素在三角形中的過程通常叫三角形遍歷(TriangleTraversal)或掃描轉換(scan conversion)。每個三角形片段的屬性均由三個三角形頂點的數據插值而生成(在第五章會有講解)。這些屬性包括片段的深度,以及來自幾何階段的著色數據。
【總結】找到哪些採樣點或像素在三角形中的過程通常叫三角形遍歷(TriangleTraversal)或掃描轉換(scan conversion)。
2.4.3 像素著色 Pixel Shading
所有逐像素的著色計算都在像素著色階段進行,使用插值得來的著色數據作為輸入,輸出結果為一種或多種將被傳送到下一階段的顏色信息。紋理貼圖操作就是在這階段進行的。
像素著色階段是在可編程GPU內執行的,在這一階段有大量的技術可以使用,其中最常見,最重要的技術之一就是紋理貼圖(Texturing)。紋理貼圖在書的第六章會詳細講到。簡單來說,紋理貼圖就是將指定圖片「貼」到指定物體上的過程。而指定的圖片可以是一維,二維,或者三維的,其中,自然是二維圖片最為常見。如下圖所示:
原書圖2.9 左上角為一沒有紋理貼圖的飛龍模型。左下角為一貼上圖像紋理的飛龍。右圖為所用的紋理貼圖。
【總結】像素著色階段的主要目的是計算所有需逐像素操作的過程。
2.4.4 融合 Merging
每個像素的信息都儲存在顏色緩衝器中,而顏色緩衝器是一個顏色的矩陣列(每種顏色包含紅、綠、藍三個分量)。融合階段的主要任務是合成當前儲存於緩衝器中的由之前的像素著色階段產生的片段顏色。不像其它著色階段,通常運行該階段的GPU子單元並非完全可編程的,但其高度可配置,可支持多種特效。
此外,這個階段還負責可見性問題的處理。這意味著當繪製完整場景的時候,顏色緩衝器中應該還包含從相機視點處可以觀察到的場景圖元。對於大多數圖形硬體來說,這個過程是通過Z緩衝(也稱深度緩衝器)演算法來實現的。Z緩衝演算法非常簡單,具有O(n)複雜度(n是需要繪製的像素數量),只要對每個圖元計算出相應的像素z值,就可以使用這種方法,大概內容是:
Z緩衝器器和顏色緩衝器形狀大小一樣,每個像素都存儲著一個z值,這個z值是從相機到最近圖元之間的距離。每次將一個圖元繪製為相應像素時,需要計算像素位置處圖元的z值,並與同一像素處的z緩衝器內容進行比較。如果新計算出的z值,遠遠小於z緩衝器中的z值,那麼說明即將繪製的圖元與相機的距離比原來距離相機最近的圖元還要近。這樣,像素的z值和顏色就由當前圖元對應的值和顏色進行更新。反之,若計算出的z值遠遠大於z緩衝器中的z值,那麼z緩衝器和顏色緩衝器中的值就無需改變。
上面剛說到,顏色緩衝器用來存儲顏色,z緩衝器用來存儲每個像素的z值,還有其他緩衝器可以用來過濾和捕獲片段信息。
- 比如alpha通道(alpha channel)和顏色緩衝器聯繫在一起可以存儲一個與每個像素相關的不透明值。可選的alpha測試可在深度測試執行前在傳入片段上運行。片段的alpha值與參考值作某些特定的測試(如等於,大於等),如果片斷未能通過測試,它將不再進行進一步的處理。alpha測試經常用於不影響深度緩存的全透明片段(見6.6節)的處理。
- 模板緩衝器(stencil buffer)是用於記錄所呈現圖元位置的離屏緩存。每個像素通常與佔用8個位。圖元可使用各種方法渲染到模板緩衝器中,而緩衝器中的內容可以控制顏色緩存和Z緩存的渲染。舉個例子,假設在模版緩衝器中繪製出了一個實心圓形,那麼可以使用一系列操作符來將後續的圖元僅在圓形所出現的像素處繪製,類似一個mask的操作。模板緩衝器是製作特效的強大工具。而在管線末端的所有這些功能都叫做光柵操作(raster operations ,ROP)或混合操作(blend operations)。
- 幀緩衝器(frame buffer)通常包含一個系統所具有的所有緩衝器,但有時也可以認為是顏色緩衝器和z緩衝器的組合。
- 累計緩衝器(accumulation buffer),是1990年,Haeberli和Akeley提出的一種緩衝器,是對幀緩衝器的補充。這個緩衝器可以用一組操作符對圖像進行累積。例如,為了產生運動模糊(motion blur.,可以對一系列物體運動的圖像進行累積和平均。此外,其他的一些可產生的效果包括景深(e depth of field),反走樣(antialiasing)和軟陰影(soft shadows)等。
而當圖元通過光柵化階段之後,從相機視點處看到的東西就可以在熒幕上顯示出來。為了避免觀察者體驗到對圖元進行處理並發送到屏幕的過程,圖形系統一般使用了雙緩衝(double buffering)機制,這意味著屏幕繪製是在一個後置緩衝器(backbuffer)中以離屏的方式進行的。一旦屏幕已在後置緩衝器中繪製,後置緩衝器中的內容就不斷與已經在屏幕上顯示過的前置緩衝器中的內容進行交換。注意,只有當不影響顯示的時候,才進行交換。
【總結】融合階段的主要任務是合成當前儲存於緩衝器中的由之前的像素著色階段產生的片段顏色。此外,融合階段還負責可見性問題(Z緩衝相關)的處理。
2.5 管線縱覽與總結
在概念上可以將圖形渲染管線分為三個階段:應用程序階段、幾何階段、光柵化階段。
這樣的管線結構是API和圖形硬體十年來以實時渲染應用程序為目標進行演化的結果。需要注意的是這個進化不僅僅是在我們所說的渲染管線中,離線渲染管線(offline rendering pipelines)也是另一種進化的路徑。且電影產品的渲染通常使用微多邊形管線(micropolygon pipelines)。而學術研究和預測渲染的(predictive rendering)應用,比如建築重建(architectural previsualization)通常採用的是光線跟蹤渲染器(ray tracing renderers)
三、本章內容提煉總結
以下是對《Real Time Rendering 3rd》第二章「圖形渲染管線」內容的文字版概括總結:
圖形渲染管線的主要功能就是決定在給定虛擬相機、三維物體、光源、照明模式,以及紋理等諸多條件的情況下,生成或繪製一幅二維圖像的過程。在概念上可以將圖形渲染管線分為三個階段:應用程序階段、幾何階段、光柵化階段。
1、應用程序階段
應用程序階段的主要任務,是將需要繪製圖元輸入到繪製管線的下一個階段,以及實現一些軟體方式來實現的方法。主要方法有碰撞檢測、加速演算法、輸入檢測,動畫,力反饋以及紋理動畫,變換模擬、幾何變形,以及一些不在其他階段執行的計算,如層次視錐裁剪等加速演算法。
對於被渲染的每一幀,應用程序階段將攝像機位置,光照和模型的圖元輸出到管線的下一個主要階段,即幾何階段。
2、幾何階段
幾何階段主要負責大部分多邊形操作和頂點操作,可以將這個階段進一步劃分成如下幾個功能階段:模型視點變換、頂點著色、投影、裁剪、屏幕映射。這些功能階段的主要功能如下:
- 【模型和視圖變換階段】:模型變換的目的是將模型變換到適合渲染的空間當中,而視圖變換的目的是將攝像機放置於坐標原點,方便後續步驟的操作。
- 【頂點著色階段】:頂點著色的目的在於確定模型上頂點處材質的光照效果。
- 【投影階段】:投影階段就是將模型從三維空間投射到了二維的空間中的一個過程。投影階段也可以理解為將視體變換到一個對角頂點分別是(-1,-1,-1)和(1,1,1)單位立方體內的過程 。
- 【裁剪階段】裁剪階段的目的,就是對部分位於視體內部的圖元進行裁剪操作。
- 【屏幕映射階段】屏幕映射階段的主要目的,就是將之前步驟得到的坐標映射到對應的屏幕坐標繫上。
在幾何階段,首先,對模型的頂點和法線進行矩陣變換,並將模型置於觀察空間中(模型和視圖變換),然後,根據材質、紋理、以及光源屬性進行頂點光照的計算(頂點著色階段),接著,將該模型投影變換到一個單位立方體內,並捨棄所有立方體之外的圖元(投影階段),而為了得到所有位於立方體內部的圖元,接下來對與單位立方體相交的圖元進行裁剪(裁剪階段),然後將頂點映射到屏幕上的窗口中(屏幕映射階段)。在對每個多邊形執行完這些操作後,將最終數據傳遞到光柵,這樣就來到了管線中的最後一個階段,光柵化階段。
3、光柵化階段
給定經過變換和投影之後的頂點,顏色以及紋理坐標(均來自於幾何階段),給每個像素正確配色,以便正確繪製整幅圖像。這個過個過程叫光柵化,即從二維頂點所處的屏幕空間(所有頂點都包含Z值即深度值,及各種與相關的著色信息)到屏幕上的像素的轉換。光柵化階段可分為三角形設定階段、三角形遍歷階段、像素著色階段、融合階段。這些功能階段的主要功能如下:
- 【三角形設定階段】三角形設定階段主要用來計算三角形表面的差異和三角形表面的其他相關數據。
- 【三角形遍歷階段】找到哪些採樣點或像素在三角形中的過程通常叫三角形遍歷。
- 【像素著色階段】像素著色階段的主要目的是計算所有需逐像素計算操作的過程。
- 【融合階段】融合階段的主要任務是合成當前儲存於緩衝器中的由之前的像素著色階段產生的片段顏色。此外,融合階段還負責可見性問題(Z緩衝相關)的處理。
在光柵化階段,所有圖元會被光柵化,進而轉換為屏幕上的像素。首先,計算三角形表面的差異和三角形表面的其他相關數據(三角形設定階段),然後,找到哪些採樣點或像素在三角形中(三角形遍歷階段),接著計算所有需逐像素計算操作(像素著色階段),然後,合成當前儲存於緩衝器中的由之前的像素著色階段產生的片段顏色,可見性問題可通過Z緩存演算法解決,隨同的還有可選的alpha測試和模版測試(融合階段)。所有對像依次處理,而最後的圖像顯示在屏幕上。
The end.
PS:從早上9點寫到晚上9點,好累...
推薦閱讀:
※反向路徑採樣在MLT演算法中的運用
※虛幻引擎學習之路:相機圖像後處理
※VRay for SketchUp工業產品表現之煤油燈
※VRay for SketchUp環境阻光(AO)的簡介與應用