《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

遊資網發表於2019-08-15
《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

這篇文章是提煉總結計算機圖形學界“九陰真經總綱”一般存在的《Real-Time Rendering 3rd》系列文章的第二篇。將帶來RTR3第二章內容“Chapter 2 The Graphics Rendering Pipeline圖形渲染管線”的總結、概括與提煉。

文章分為全文內容思維導圖、核心內容分章節提煉、本章內容提煉總結三個部分來呈現,其中:

•文章的第一部分,“全文內容思維導圖”,分為“章節框架思維導圖”和“知識結構思維導圖”兩個部分。

•文章的第二部分,“核心內容分節提煉”,是按原書章節順序分佈的知識梳理。

•而文章的第三部分“本章內容提煉總結”,則是更加精煉,只提煉出關鍵資訊的知識總結。

一、全文內容思維導圖


1.章節框架思維導圖

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

2.知識結構思維導圖

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

二、核心內容分節提煉

2.1影象渲染管線架構概述Architecture

渲染管線的主要功能就是決定在給定虛擬相機、三維物體、光源、照明模式,以及紋理等諸多條件的情況下,生成或繪製一幅二維影象的過程。對於實時渲染來說,渲染管線就是基礎。因此,我們可以說,渲染管線是實時渲染的底層工具。

圖2.1展示了使用渲染管線步驟。渲染出的影象的位置、形狀是由它們的幾何形狀,環境特性,攝像機位置決定的。而物體的外觀由材質特性,光源,紋理和著色模型確定。

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖2.1左圖中,相機放在稜椎的頂端(四條線段的交匯點),只有可視體內部的圖元會被渲染。

在概念上可以將圖形渲染管線分為三個階段:

•應用程式階段(The Application Stage)
•幾何階段(The Geometry Stage)
•光柵化階段(The Rasterizer Stage)

如下圖:

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖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所示。

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖2.3幾何階段細分為的功能階段管線

需要注意:

•根據具體實現,這些階段可以和管線階段等同,也可以不等同。在一些情況下,一系列連續的功能階段可以形成單個管線階段(和其他管線階段並行執行)。在另外情況下,一個功能階段可以劃分成其他更細小的管線階段。

•幾何階段執行的是計算量非常高的任務,在只有一個光源的情況下,每個頂點大約需要100次左右的精確的浮點運算操作。

2.3.1模型和檢視變換Model and View Transform

•在螢幕上的顯示過程中,模型通常需要變換到若干不同的空間或座標系中。模型變換的變換物件一般是模型的頂點和法線。物體的座標稱為模型座標。世界空間是唯一的,所有的模型經過變換後都位於同一個空間中。

•不難理解,應該僅對相機(或者視點)可以看到的模型進行繪製。而相機在世界空間中有一個位置方向,用來放置和校準相機。

•為了便於投影和裁剪,必須對相機和所有的模型進行視點變換。變換的目的就是要把相機放在原點,然後進行視點校準,使其朝向Z軸負方向,y軸指向上方,x軸指向右邊。在視點變換後,實際位置和方向就依賴於當前的API。我們稱上述空間為相機空間或者觀察空間。

下圖顯示了視點變換對相機和模型的影響。

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖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)。

如下圖所示。

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖2.5左邊為正交投影,右邊為透視投影

兩種投影方式的主要異同點:

•正交投影。正交投影的可視體通常是一個矩形,正交投影可以把這個視體變換為單位立方體。正交投影的主要特性是平行線在變換之後彼此之間仍然保持平行,這種變換是平移與縮放的組合。

•透視投影。相比之下,透視投影比正交投影複雜一些。在這種投影中,越遠離攝像機的物體,它在投影后看起來越小。更進一步來說,平行線將在地平線處會聚。透視投影的變換其實就是模擬人類感知物體的方式。

•正交投影和透視投影都可以通過4 x 4的矩陣來實現,在任何一種變換之後,都可以認為模型位於歸一化處理之後的裝置座標系中。

雖然這些矩陣變換是從一個可視體變換到另一個,但它們仍被稱為投影,因為在完成顯示後,Z座標將不會再儲存於的得到的投影圖片中。通過這樣的投影方法,就將模型從三維空間投影到了二維的空間中。

【總結】投影階段就是將模型從三維空間投射到了二維的空間中的過程。

2.3.4裁剪Clipping

只有當圖元完全或部分存在於視體(也就是上文的規範立方體,CVV)內部的時候,才需要將其傳送到光柵化階段,這個階段可以把這些圖元在螢幕上繪製出來。

不難理解,一個圖元相對視體內部的位置,分為三種情況:完全位於內部、完全位於外部、部分位於內部。所以就要分情況進行處理:

•當圖元完全位於視體內部,那麼它可以直接進行下一個階段。

•當圖元完全位於視體外部,不會進入下一個階段,可直接丟棄,因為它們無需進行渲染。

•當圖元部分位於視體內部,則需要對那些部分位於視體內的圖元進行裁剪處理。

對部分位於視體內部的圖元進行裁剪操作,這就是裁剪過程存在的意義。裁剪過程見下圖。

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖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)進入光柵化階段。如下圖:

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖2.8經過投影變換,圖元全部位於單位立方體之內,而螢幕對映主要目的就是找到螢幕上對應的座標

螢幕對映階段的一個常見困惑是整型和浮點型的點值如何與畫素座標(或紋理座標)進行關聯。可以使用Heckbert[書後參考文獻第520篇]的策略,用一個轉換公式進行解決。

【總結】螢幕對映階段的主要目的,就是將之前步驟得到的座標對映到對應的螢幕座標系上。

2.4光柵化階段The Rasterizer Stage

給定經過變換和投影之後的頂點,顏色以及紋理座標(均來自於幾何階段),給每個畫素(Pixel)正確配色,以便正確繪製整幅影象。這個過個過程叫光珊化(rasterization)或掃描變換(scan conversion),即從二維頂點所處的螢幕空間(所有頂點都包含Z值即深度值,及各種與相關的著色資訊)到螢幕上的畫素的轉換。

與幾何階段相似,該階段細分為幾個功能階段:

•三角形設定(Triangle Setup)階段

•三角形遍歷(Triangle Traversal)階段

•畫素著色(Pixel Shading)階段

•融合(Merging)階段

如下圖所示:

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖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)。紋理貼圖在書的第六章會詳細講到。簡單來說,紋理貼圖就是將指定圖片“貼”到指定物體上的過程。而指定的圖片可以是一維,二維,或者三維的,其中,自然是二維圖片最為常見。如下圖所示:

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

原書圖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.

《Real-Time Rendering 3rd》 提煉總結(二): 圖形渲染管線

作者:毛星雲
專欄地址:https://zhuanlan.zhihu.com/p/26527776

相關文章