渲染管線

pdf文檔

基礎

GPU處理流程

GPU處理流程

以下是渲染管線流程中的主要幾個步驟:

(頂點座標變換)一旦頂點座標被轉換到eye space 中,就需要判斷哪些點是視點可見的。位於viewing frustum 梯形體以內的頂點,被認定爲可見,而超出這個梯形體之外的場景數據,會被視點去除(Frustum Culling,也稱之爲視錐裁剪)。這一步通常稱之爲“clip(裁剪)”,識別指定區域內或區域外的圖形部分的過程稱之爲裁剪算法。

 

Primitive Assembly,圖元裝配,即將頂點根據primitive(原始的連接關係),還原出網格結構。網格由頂點和索引組成,在之前的流水線中是對頂點的處理,在這個階段是根據索引將頂點鏈接在一起,組成線、面單元。之後就是對超出屏幕外的三角形進行裁剪,想象一下:一個三角形其中一個頂點在畫面外,另外兩個頂點在畫面內,這是我們在屏幕上看到的就是一個四邊形。然後將該四邊形切成兩個小的三角形。

 

光柵化:決定哪些像素被集合圖元覆蓋的過程(Rasterization isthe process of determining the set of pixels covered by a geometric primitive)。經過上面諸多座標轉換之後,現在我們得到了每個點的屏幕座標值(Screen coordinate),也知道我們需要繪製的圖元(點、線、面)。但此時還存在兩個問題,問題一:點的屏幕座標值是浮點數,但像素都是由整數點來表示的,如果確定屏幕座標值所對應的像素?問題二:在屏幕上需要繪製的有點、線、面,如何根據兩個已經確定位置的2 個像素點繪製一條線段,如果根據已經確定了位置的3 個像素點繪製一個三角形面片?

 

Pixel operation 又稱爲Raster Operation,是在更新幀緩存之前,執行最後一系列針對每個片段的操作,其目的是:計算出每個像素的顏色值。在這個階段,被遮擋面通過一個被稱爲深度測試的過程而消除,這其中包含了很多種計算顏色的方法以及技術。

 

GPU處理流程中的幾個主要裁減算法:

裁減算法主要包括:視域剔除(View FrustumCulling)、背面剔除(Back-Face Culling)、遮擋剔除(Occlusing Culling)和視口裁減等。

視域剔除

在投影變換後進行

背面剔除

圖元裝配

遮擋剔除

光柵化中的Depth Test

視口裁減

暫不清楚

裁減操作

 

標準的Raster Operations(光柵操作):

 

標準OpenGL和Direct3D 中的Raster Operations(光柵操作)

標準OpenGL和Direct3D 中的Raster Operations(光柵操作)

 


梳理管線中的主要流程

頂點變換(Vertex Transformation):

頂點變換是圖形硬件渲染管線種的第一個處理階段。頂點變換在每個頂點上執行一系列的數學操作。這些操作包括把頂點位置變換到屏幕位置以便光柵器使用,爲貼圖產生紋理座標,以及照亮頂點以決定它的顏色。

 

主要的座標系統和變換:

用於頂點處理的座標系統和變換

用於頂點處理的座標系統和變換

 

二.圖元裝配(Primitive Assembly)和光柵化(Rasterization)

  經過變換的頂點流按照順序被送到下一個被稱爲圖元裝配和光柵化的 階段。首先,在圖元裝配階段根據伴隨頂點序列的幾何圖元分類信息把頂點裝配成幾何圖元。這將產生一序列的三角形、線段和點。這些圖元需要經過裁剪到可視平截體(三維空間中一個可見的區域)和任何有效地應用程序指定的裁剪平面。光柵器還可以根據多邊形的朝前或朝後來丟棄一些多邊形。這個過程被稱爲挑選 (culling)。 

  經過裁剪和挑選剩下的多邊形必須被光柵化。光柵化是一個決定哪些 像素被幾何圖元覆蓋的過程。多邊形、線段和點根據爲每種圖元指定的規則分別被光柵化。光柵化的結果是像素位置的集合和片段的集合。當光柵化後,一個圖元擁有的頂點數目和產生的片段之間沒有任何關係。例如,一個由三個頂點組成的三角形佔據整個屏幕,因此需要生成上百萬的片段。

  片段和像素之間的區別變得非常重要。術語像素(Pixel)是圖像元素的簡稱。一個像素代表幀緩存中某個指定位置的內容,例如顏色,深度和其它與這個位置相關聯的值。一個片段(Fragment)是更新一個特定像素潛在需要的一個狀態。之所以術語片段是因爲光柵化會把每個幾何圖元(例如三角形)所覆蓋的像素分解成像素大小的片段。一個片段有一個與之相關聯的像素位置、深度值和經過插值的參數,例如顏色,第二(反射)顏色和一個或多個紋理座標集。這些 各種各樣的經過插值的參數是來自變換過的頂點,這些頂點組成了某個用來生成片段的幾何圖元。你可以把片段看成是潛在的像素。如果一個片段通過了各種各的光光柵化測試,這個片段將被用於更新幀緩存中的像素。

 

三.插值、貼圖和着色

  當 一個圖元被光柵化爲一堆零個或多個片段的時候,插值、貼圖和着色階段就在片段屬性需要的時候插值,執行一系列的貼圖和數學操作,然後爲每個片段確定一個最終的顏色。除了確定片段的最終顏色,這個階段還確定一個新的深度,或者甚至丟棄這個片段以避免更新幀緩存對應的像素。允許這個階段可能丟棄片段,這個階段 爲它接收到的每個輸入片段產生一個或不產生着過色的片段。

 

四.光柵操作(RasterOperations)

  光柵操作階段在最後更新幀緩存之前,執行最後一系列的針對每個片段的操作。這些操作是OpenGL和Direct3D的一個標準組成部分。在這個階段,隱藏面通過一個被稱爲深度測試的過程而消除。其它一些效果,例如混合和基於模板的陰影也發生在這個階段。

  光柵操作階段根據許多測試來檢查每個片段,這些測試包括剪切、 alpha、模板和深度等測試。這些測試涉及了片段最後的顏色或深度,像素的位置和一些像素值(像素的深度值和模板值)。如果任何一項測試失敗了,片段就會在這個階段被丟棄,而更新像素的顏色值(雖然一個模板寫入的操作也許會發生)。通過了深度測試就可以用片段的深度值代替像素深度值了。在這些測試之後, 一個混合操作將把片段的最後顏色和對應像素的顏色結合在一起。最後,一個幀緩存寫操作用混合的顏色代替像素的顏色。

 

形象化圖形流水管線:

形象化圖形流水管線

形象化圖形流水管線

 

 


可編程圖形流水線

 

可編程着色器結構:

可編程圖形渲染管線

可編程圖形渲染管線

 

 

着色器局部示意圖:

 

圖形硬件渲染管線

圖形硬件渲染管線

 

 頂點着色器和像素着色器的數據處理流程:

頂點着色器和像素着色器的數據處理流程

頂點着色器和像素着色器的數據處理流程

 

圖中展示了在頂點着色器和像素着色器的數據處理流程。在應用程序中設定的圖元信息(頂點位置座標、顏色、紋理座標等)傳遞到vertex buffer 中;紋理信息傳遞到texture buffer 中。其中虛線表示目前還沒有實現的數據傳遞。當前的頂點程序還不能處理紋理信息,紋理信息只能在片斷程序中讀入。

頂點着色器:

       頂點着色程序從GPU 前端模塊(寄存器)中提取圖元信息(頂點位置、法向量、紋理座標等),並完成頂點座標空間轉換、法向量空間轉換、光照計算等操作,最後將計算好的數據傳送到指定寄存器中;然後片斷着色程序從中獲取需要的數據,通常爲“紋理座標、光照信息等”,並根據這些信息以及從應用程序傳遞的紋理信息(如果有的話)進行每個片斷的顏色計算,最後將處理後的數據送光柵操作模塊。

像素(片段)着色器:

       片斷着色程序對每個片斷進行獨立的顏色計算,最後輸出顏色值的就是該片段最終顯示的顏色。可以這樣說,頂點着色程序主要進行幾何方面的運算,而片段着色程序主要針對最終的顏色值進行計算。片段着色程序還有一個突出的特點是:擁有檢索紋理的能力。對於GPU 而言,紋理等價於數組,這意味着,如果要做通用計算,例如數組排序、字符串檢索等,就必須使用到片段着色程序。讓頂點着色器也擁有檢索紋理的能力,是目前的一個研究方向。


注:

       文中的主要內容來源於網絡,歡迎參考!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章