Direct3D 12入門教程之 ---- 渲染流水線介紹

本文主要參考 《DirectX 12 3D遊戲開發實戰》一書,
以及微軟官方的Direct3D 12示例:DirectX-Graphics-Samples

渲染流水線:又稱渲染管線,指的是將3D場景變換至2D場景的處理流程,具體由以下流程:
在這裏插入圖片描述
這幅圖就展示了整個Direct3D的渲染流程,有必要記住圖內的一些名詞以及縮寫,後面會經常使用到。

注,這裏面我目前對外殼着色器和域着色器尚不瞭解,書中也還沒有提到,暫且不談

  • 輸入裝配器階段(Input Assembler,IA):從顯存中讀取幾何數據(頂點和索引),並依據指定的圖元拓撲將他們裝配爲幾何圖元(geometric primitive).關於圖元拓撲,可以詳見:圖形學基礎概念------圖元拓撲
    在這個階段中,我們需要通過頂點緩衝區(vertex buffer)的數據結構,將頂點與渲染流水線進行綁定,頂點緩衝區使用連續的內存來存儲一系列的頂點。(這裏的內存指的是CPU端的內存,而非GPU端的顯存)

在繪製幾何體時,大多頂點數據是重複的,比如繪製立方體時,僅有8個頂點,卻有12個三角形,意味着,若我們使用頂點表示此立方體,需要24個頂點數據,這是一個極大的浪費,想象一下,若場景中有1w個這樣的立方體,全部使用頂點進行表示,得多使用10000*16個頂點數據的內存大小,每個頂點數據又是一個4維的座標向量,這個多使用的內存就很可觀了,

如果使用頂點索引的形式來表示立方體,我們就只需要存儲8個頂點,給出24個頂點索引即可,每個索引是一個整形,這樣就極大的降低了內存的消耗,使用頂點索引的方式相當於消耗了 8+24/4 = 14個頂點數據的內存,每個立方體相比頂點表示降低了10個頂點數據的內存消耗,除了內存消耗,也可以讓圖形硬件不用重複處理同一個頂點數據,畢竟着色器可是會中式的處理每個頂點的。

使用頂點索引相比使用頂點數據的好處有:

  • 索引皆是簡單的整數,不會像使用整個頂點結構體那樣佔用更多的內存
  • 若輔以適當的頂點緩存排序,則圖形硬件將不必再次處理重複使用的頂點,從緩存中直接取得即可,
    關於第二點,想象一下,使用頂點表示立方體有24個頂點,意味着硬件要處理24個頂點,其中有16個重複處理的,而使用索引時,僅需要處理8個頂點,並且可以將其緩存下來,對這8個頂點重複使用即可
  • 頂點着色器階段(Vertex Shader Stage,簡記作VS):我們可以把頂點着色器看作是一種輸入與輸出均爲單個頂點的函數,每個要被繪製的頂點都須經過頂點着色器的處理後再送往後續的階段,
    在頂點着色器中,我們不但可以訪問頂點數據,也能訪問紋理以及其他存於顯存中的數據
    一般而言,我們會需要在頂點着色中對頂點座標進行一系列變換:世界變換(將模型的局部座標轉換到全局場景中)->取景變換(將世界空間內的座標轉換爲觀察空間中的座標)->投影變換(將3D頂點投影到2D平面上)

事實上,我們可以認爲在硬件中執行的是一下處理過程:
for(UINT i=0;i<numVertices; ++i)
outputVertex[i] = VertexShader(inputVertex[i]);
而其中的VertexShader函數就是我們需要在頂點着色器中實現的內容

  • 曲面細分階段(tessellation stages):利用鑲嵌化處理技術對網格中的三角形進行細分(subdivide),以此來增加物體表面上的三角形數量,再將這些新增的三角形偏移到合適的位置,使得網格表現出更加細膩的細節。

可以通過曲面細分實現lLOD(level-of-detail)
曲面細分是Direct 3D 11中新引入的處理階段

  • 幾何着色器階段(Geometry Shader Stage,GS):是一個可選的渲染階段,幾何着色器接受的輸入應該是完整的圖元,可以創建或銷燬幾何體,比如可以將輸入的圖元拓展爲一個或多個其他圖元,或者依據某些條件不輸出任何圖元。頂點着色器與之相比,則不能創建頂點:僅能接受輸入的單個頂點,處理後將頂點輸出。

可以注意上面的 “流輸出(stream-out)”階段的箭頭,意味着,幾何着色器能夠爲後續的繪製操作將頂點數據流輸出值顯存中的某個緩衝區之內。

  • 裁剪:裁剪在可視範圍外的頂點

  • 光柵化階段(Rasterization Stage RS):爲最終投影至平面上的3D三角形計算對應像素的顏色

    • 視口變換:裁剪完後,硬件通過投影變換將3D頂點變換爲2D頂點,需要將2D頂點變換到指定屏幕區域內,這個變換過程稱爲視口變換
    • 背面剔除:用於將背面朝向的三角形從渲染流水線中除去,在Direct3D中默認情況下,以觀察者的視角把順時針繞序的三角形看成正面朝向,逆時針繞序的三角形當成背面朝向(可以通過對渲染狀態的設置,將這個反過來)
    • 頂點屬性插值 :到目前爲止,我們得到的依然是頂點圖元,爲了填充屏幕上的像素點,我們需要利用三角形頂點的屬性值計算出內部的像素的屬性值,也就是插值法
  • 像素着色器階段(Pixel Shader, PS):針對每個像素片段(pixel fragment,也稱片元),進行處理,即每個像素需要執行以此像素着色器。

  • 輸出合併階段(Output Merger, OM):在此階段中,一些像素片段可能會被丟棄,比如那些未通過深度緩衝區測試或者模板緩衝區測試的像素片段,剩下來的像素會被寫入後臺緩衝區中,混合(blend, 也稱融合)操作也是在此階段實現的,此技術可以讓當前處理的像素與後臺緩衝區對應像素相融合,而不僅是對後者進行完全的覆寫,


這裏面有些概念還是理解不夠清晰,以後完全理解了回來進一步解釋

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