轉載請注明出處:http://www.cnblogs.com/Ray1024
一、概述
這篇文章主要講解渲染管線(rendering pipeline)的理論知識。
渲染管線是指:在給定一個3D場景的幾何描述及一架已確定位置和方向的虛擬攝像機(virtual camera)時,根據虛擬攝像機的視角生成2D圖像的一系列步驟。
下圖所示為構成渲染管線的各個階段,以及與各個階段相關的內存資源。
從上圖中我們可以看到,渲染管線就像工廠中的流水線,把各個處理過程分成不同的階段,各個階段可以獨立工作,這樣,各個階段就可以同時工作,效率自然就會比較高。3D渲染從最初的場景描述到最終的顯示結果,這整個過程就是在3D渲染管線中完成的。
這篇文章中,我們將詳細講解D3D11中渲染管線的各個階段。
二、渲染管線的各個階段
2.1 輸入裝配階段
輸入裝配(Input Assembler,簡稱IA)階段從內存讀取幾何數據(頂點和索引)並將這些數據組合為幾何圖元(例如,三角形、直線)。我們通過指定圖元拓撲來告訴Direct3D以何種方式組成幾何圖元。D3D11中常見的拓撲類型有以下幾種:
(1)點列表(point list):每個頂點都會被繪制為一個獨立的點,如下圖:
(2)線帶(line strip):前后相鄰的兩個頂點會形成一條直線,如下圖:
(3)線列表(line list):每兩個頂點會形成一條獨立的直線,如下圖:
(4)三角形帶(triangle strip):帶狀方式形成連續的三角形,如下圖:
(5)三角形列表(triangle list):每三個頂點會形成一個獨立的三角形,如下圖:
例如,使用三角形列表來構建四邊形,給出頂點數組和索引列表:
Vertex v[4] = {v0, v1, v2, v3};
UINT indexList[6] = {0, 1, 2, // Triangle0
0, 2, 3}; // Triangle1
構成下圖由兩個三角形組成的四邊形:
除了這5種拓撲圖元類型外,還有兩種:帶有鄰接信息的圖元和控制點面片列表。這里不多作介紹,在后面學習到曲面細分技術時再來了解。
2.2 頂點着色器階段
在完成圖元裝配后,頂點將被送往頂點着色器(vertex shader)階段。
頂點着色器可以被看成是一個以頂點作為輸入輸出數據的函數。每個將要繪制的頂點都會通過頂點着色器推送至硬件。頂點着色器函數由我們自己編寫,但是它會在GPU上運行,所以執行速度非常快。許多效果,比如變換(transformation)、光照(lighting)和置換貼圖映射(displacement mapping)都是由頂點着色器來實現的。記住,在頂點着色器中,我們不僅可以訪問輸入的頂點數據,也可以訪問在內存中的紋理和其他數據,比如變換矩陣和場景燈光。
(1) 局部空間和世界空間
我們在創建3D場景時,不在全局場景坐標系(world space,世界空間)中建立物體,而是在局部坐標系(local space,局部空間)中建立物體;局部坐標系是最常用的實用坐標系,它的原點接近於物體中心,坐標軸的方向與物體的方向對齊。在完成3D模型的制作之后,將模型放到全局場景中;通過計算局部坐標系相對於世界坐標系的原點和軸向,實現相應的坐標轉換變換。將坐標從局部坐標系轉換到世界坐標系的過程稱為世界變換(world transform),相應的變換矩陣稱為世界矩陣(world matrix)。當所有的物體都從局部空間變換到世界空間后,這些物體就會位於同一個坐標系(世界空間)中。如果你希望直接在世界空間中定義物體,那么可以使用單位世界矩陣(identity world matrix)。
(2)觀察空間
我們在場景中指定一個虛擬攝像機,我們把一個局部坐標系(稱為觀察空間、視覺空間或攝像機空間)附加在攝像機上,該坐標系以攝像機的位置為原點,以攝像機的觀察方向為z軸正方向,以攝像機的右側為x軸,以攝像機的上方為y軸。在渲染管線的隨后階段中,使用觀察空間來描述頂點比使用世界空間來描述頂點要方便的多。從世界空間到觀察空間的坐標轉換稱為觀察變換(view transform),相應的矩陣稱為觀察矩陣(view matrix)。
(3)投影與齊次剪裁空間
攝像機能看到的范圍通過一個平截頭體(frustum)來描述,它是一個在近平面處削去尖部的棱錐體,如下圖。
這個空間即世界空間的物體被投影到相應的投影面上之后,繼而進行裁剪操作所在的空間叫投影與齊次剪裁空間。
2.3 曲面細分階段
Hull Shader Stage、Tessellation Stage、Domain Shader Stage統稱為曲面細分階段(Tessellation Stage),指通過添加三角形的方式對一個網格的三角形進行細分,這些新添加的三角形可以偏移到一個新的位置,讓網格的細節更加豐富。曲面細分階段是Direct3D 11中新添加的,這樣我們就可以在GPU上對幾何體進行細分了。曲面細分階段是可選的,我們將在以后詳細介紹。
2.4 幾何着色器階段
幾何着色器階段(geometry shader stage)是D3D11中加入的新特性,是可選的。幾何着色器以完整的圖元作為輸入數據。例如,當我們繪制三角形列表時,輸入到幾何着色器的數據是構成三角形的三個點。(注意,這三個點是從頂點着色器傳遞過來的。)幾何着色器的主要優勢是它可以創建或銷毀幾何體。例如,輸入圖元可以被擴展為一個或多個其他圖元,或者幾何着色器可以根據某些條件拒絕輸出某些圖元。這一點與頂點着色器有明顯的不同:頂點着色器無法創建頂點,只要輸入一個頂點,那么就必須輸出一個頂點。幾何着色器通常用於將一個點擴展為一個四邊形,或者將一條線擴展為一個四邊形。這是一項高級技術,我們會在后面的章節中對它進行討論,這里只做一個簡短的概述。
2.5 光柵化階段
光柵化(rasterization)階段的主要任務是為投影后的3D三角形計算像素顏色。這個階段屬於不可編程階段,即完全由硬件實現,主要包括:
(1)視口變換
即把投影變換后得到的頂點的x,y坐標,根據用戶設定的視口參數,變換到屏幕上對應的坐標。
(2)背面消隱(Backface Culling)
攝像機不會看到實心物體的背面,所以繪制它們是毫無意義的。背面消隱是指讓管線放棄對朝后的三角形的處理。這可以將所要處理的三角形的數量降低到原數量的一半。
(3)頂點屬性差值
我們通過指定三角形的3個頂點來定義一個三角形。除位置外,頂點還可以包含其他屬性,比如顏色、法線向量和紋理坐標。在視口變換之后,這些屬性必須為三角形表面上的每個像素進行插值。頂點深度值也必須進行插值,以使每個像素都有一個可用於深度緩存算法的深度值。對屏幕空間中的頂點屬性進行插值,其實就是對3D空間中的三角形表面進行線性插值這一工作需要借助所謂的透視矯正插值(perspective correct interpolation)來實現。本質上,三角形表面內部的像素顏色都是通過頂點插值得到的。
2.6 像素着色器階段
像素着色器(Pixel shader)是由我們編寫的在GPU上執行的程序。像素着色器會處理每個像素片段(pixel fragment),它的輸入是插值后的頂點屬性,由此計算出一個顏色。像素着色器可以非常簡單地輸出一個顏色,也可以很復雜,例如實現逐像素光照、反射和陰影等效果。
2.7 輸出合並階段
在輸出合並(output merger,簡稱OM)階段中,某些像素片段會被丟棄(例如,未能通過深度測試或模板測試)。未丟棄的像素片段會被寫入后台緩沖區。混合(blending)工作是在該階段中完成的,一個像素可以與后台緩沖區中的當前像素進行混合,並以混合后的值作為該像素的最終顏色。某些特殊效果,比如透明度,就是通過混合來實現的,我們在以后的學習中會介紹。
三、結語
Direct3D11整個渲染管線就介紹到這里,我們最后總結一下,渲染管線的各個階段按照先后順序分別為:輸入裝配階段、頂點着色器階段、曲面細分階段、幾何着色器階段、光柵化階段、像素着色器階段和輸出合並階段。
3D渲染管線是非常重要的3D圖形學的理論知識。在之后的學習中,我們將學習渲染管線的實際使用。