【DirectX11】第二篇 DirectX11渲染管線之Input Assembler Stage(IA)

來源:互聯網
上載者:User

標籤:

本系列主要翻譯和參考《Real-Time 3D Rendering with DirectX and HLSL》一書(感謝原書作者),同時會加上一點個人理解或拓展。
這裡是書中的代碼和資源。

DirectX11 渲染管線

一般電腦中共有兩個處理器是你可能會對其進行編程的,一個是central processing unit(CPU),一個是GPU。這兩個組件有著截然不同的硬體結構和指令集。在圖形編程領域,你編寫的軟體可能兩方面都要涉及,對於CPU,你可能會使用到例如C++這樣的程式設計語言,而對於GPU則需要使用諸如HLSL這樣的語言。大部分關於圖形編程的文章要麼集中於CPU方面要麼是GPU方面,這些內容其實都是有緊密聯絡的。在本書中,你將可以同時瞭解到兩方面的內容。
DirectX當中的DirectX 3D API是本書著重關注的部分。Direct3D是用來繪製3D圖形的系統介面,他還定義了怎樣將即時圖形渲染到螢幕的一系列步驟。這些步驟就被稱之為DirectX3D圖形渲染管線(詳見圖1.1)。在這張圖中,單向箭頭標識了資料是怎樣從一個階段傳輸到下一個,雙向箭頭則標識了資源和哪些渲染階段間可以進行資料讀寫。那些可以用HLSL編程的模組已經用圓角矩形標識出來。接下來的內容將會詳細介紹渲染管線中的各個模組。

輸入裝配階段:The Input-Assembler Stage(IA)

輸入裝配階段是渲染管線的入口,也是第一個階段,在這個階段裡你需要提供待渲染對象的頂點和索引資料。輸入裝配階段將這些資料“裝配”成基本類型資料(例如:點列表,線條帶,三角列表)並根據需要將資料輸出給頂點著色渲染階段。

Vertex Buffers頂點緩衝

一個頂點至少包含了在3D空間中的一個位置。之所以說至少是因為頂點還可以包含顏色資訊,法線資訊(用於計算光照),紋理座標資訊等等。所有這些資料都可以在輸入裝配階段進行頂點緩衝。Direct3D中定義的這些頂點資訊完全可以由程式員進行操作。你可以定義頂點所要包含的資訊並通過input-layout對象定義頂點快取資料如何流入IA階段。之後的文章(原書Part III,Rendering with DirectX)中將會介紹如何定義頂點緩衝以及input layout對象,現在只是大概的介紹一下這些術語。
兩個頂點代表線段的兩個端點,三個頂點可以代表一個三角形(1.2)。

Index Buffers索引緩衝

索引緩衝是第二種在輸入裝配階段推薦的輸入類型。索引緩衝的定義關聯了頂點緩衝中的某些頂點,可以用來減少需要多次使用到的頂點的重複。想象以下情境:你需要渲染一個矩形(或寬泛的說,四邊形)。這個四邊形至少需要定義四個頂點。但是Direct3D並不支援將四邊形作為基礎類型(因為根本沒有必要專門定義一個四邊形,所有的四邊形都可以拆分成三角形)。為了渲染這個四邊形,你需要將其拆分成兩個由三個頂點構成的三角形(1.3)。所以,現在你需要總共六個頂點資訊,而不是四個,其中必然有兩個頂點資訊是重複的。但如果定義了索引緩衝,你就可以通過定義四個頂點資訊和六個與頂點緩衝相關的索引資訊來完成渲染。

現在,你可能會思考一個問題,“我怎麼通過增加索引緩衝來減少我所使用的整體資料大小呢?”那麼我們需要再考慮兩種情況,通過結合上面提到的四邊形進行具體資料分析:

  • 第一種情況

    你的頂點資料只包含3D位置資訊(x,y,z),每個軸向需要一個32-bit來儲存這個浮點數(每個軸向為4byte),那麼每個頂點需要12byte。所以在不包含索引緩衝的情況下這個四邊形只需要72位元組儲存(6 vertices * 12 bytes/vertex)。如果加上索引緩衝,你的頂點緩衝需要的空間是48byte(4 vertices * 12 bytes/vertex)。以16bit的int類型資料來儲存索引,則你需要額外12bytes(6 indices * 2 bytes/index = 12 byte)。這時,總共需要60byte來儲存這個四邊形。這麼看的話好像也沒節省很多空間。

  • 第二種情況

    當你的模型中不僅包含位置資訊,還可能包含16byte的顏色資訊,12byte的法線資訊以及8byte的紋理座標資訊。那麼每個頂點將需要多花費36byte的空間。或許當模型不是太大的時候並不會有很多影響,但如果模型具有成千上萬的點時你會發現多出來的空間佔用是相當可觀的。還有,你不僅需要考慮空間佔用的大小,還有當CPU和GPU之間進行資料轉送時,是需要通過圖形匯流排(例如PCI Express)來傳輸的,這種匯流排的傳輸速度通常非常慢(相比於CPU向RAM傳輸,以及GPU向VRAM傳輸),所以如何減少資料對你來說將會是至關重要的。

Primitive Types基本類型

當你向IA階段提供頂點快取資料時,你也必須定義這些頂點的拓撲結構,這決定了渲染管線將如何解釋這些頂點。DirectX3D提供了以下幾種基本類型(1.4和1.5):
- Point list 點列表:一系列單獨渲染毫無關聯的點
- Line list 線列表:一系列成對關聯的點,這些一對一對的點之間是沒有關聯的
- Line strip 線條帶:一系列成對關聯的點,但每對點的末點會和下一對點的起點有關聯
- Triangle list 三角列表:是我們最常見的拓撲結構,在三角列表中每三個頂點組成一個獨立的三角形。三角形之間公用的點將會重複出現(除非定義了索引緩衝)。
- Triangle strip 三角條帶:每三個頂點構成一個三角形,公用的頂點將不會重複,所以頂點間會密切的連在一起。

Primitive with Adjacency鄰接基元

從DirectX10開始,Direct3D已經加入了包含鄰接資料的基本資料。對於鄰接基元來說,你不只要定義基本資料,還需要定義圍繞在這個基元周圍的資料。(1.6)這是用來做幾何著色器的,這裡每個特定的集合著色程式需要訪問鄰接三角形。臨界三角形需要和原始三角形一起被提交給頂點/索引緩衝,並且用D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ這個拓撲結構。注意到鄰接三角形只是被用來作為幾何著色器的輸入,並不會被畫出來。如果沒有幾何著色器,鄰接三角形也還是不會被畫出來。

Control Point Patch Lists控制點片

控制點片作為一個拓撲結構提供給細分曲面階段使用。相關內容將會在後面的幾何細分曲面著色器文章中介紹。

參考文章:關於輸入裝配階段的詳細內容和具體實現請參考[這篇文章](http://www.aiseminar.com/bbs/home.php?mod=space&uid=3&do=blog&id=2622)。
在做完IA部分的資料翻譯和整理後發現篇幅比預期長一些,於是剩下的幾個渲染階段將會在下一篇文章中總結。

【DirectX11】第二篇 DirectX11渲染管線之Input Assembler Stage(IA)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.