天天看點

Directx11教程(15) D3D11管線(4)

本章我們首先了解一下D3D11中的邏輯管線,認識一下管線中每個stage的含義。

D3D11邏輯管線如下圖所示:

Directx11教程(15) D3D11管線(4)

首先,我們來學習一下每個stage的名字含義,在後面章節學習它們的細節功能:

IA:input assembler,輸入裝配階段,主要是從記憶體中讀頂點和索引資料。

VS: vertex shader, 頂點着色階段,在shader中逐個處理頂點,輸出處理後的頂點。

HS: hull shader,這是D3D11中增加的階段,主要是tessllation使用,輸入patch(其實就是帶控制點的體元),産生控制點,被domain shader階段使用,也可以在HS階段,增加一些額外的控制點資料。HS階段還會産生TS階段使用細分因子(FACTOR)。

TS: Tessellation stage,細分三角形,quad或者線段,産生頂點和連通性。

DS: Domain shader, 從HS得到控制點,從TS得,頂點uv坐标,産生最終的細分頂點。

GS: geometry shader,輸入體元,輸出不同的體元。

SO: streamout stage, 把GS之後的頂點資料輸出到video memory中。

RS: Rasterize stage, 光栅化階段,光栅化體元。

PS: pixel shader, 對光栅化後的體元,進行逐像素操作,通常執行紋理光照顔色混合等。

OM: output merge stage,執行一些blending操作,并把像素顔色輸出到framebuffer中,最終在螢幕上顯示出來。

      當然除了上述階段之外,也可以把整個D3D11管線了解為一個computer shader階段,來做一些通用計算,後面有機會在詳細了解。

在D3D11的邏輯管線中,有些shader階段是可選的,比如GS,Tessellation等。

我們通常使用的shader階段組合是:

VS-PS

VS-GS-PS

VS-HS-TS-DS-PS

VS-HS-TS-DS-GS-PS

VS-SO

VS-GS-SO

VS-HS-TS-DS-GO-SO

下面,我們接着上一篇教程,結合邏輯管線和實體管線來了解IA階段GPU做些什麼事情。

     上一章中,我們的頂點已經經過了driver層,到達了video memory中,我們的狀态設定和draw call指令也通過driver到達了CP的FIFO中,正準備被CP排程到不同的硬體block中去。

現在我們看看IA階段做些什麼工作(我們隻是畫一個三角形,是以隻有VS-PS):

      CP把command packet中state資料通過資料總線送到shader或其它相關block,這些狀态資料一般都是設定相應block的相關寄存器值。

      drawcall指令為被送到IA  block(頂點裝配block),IA會從video memory中取相應的頂點索引緩沖(可能會經過一個vertex cache)。當index頂點資料達到一個排程機關比如AMD的一個wave(64),NV的一個warp(32),VS排程會啟動一個VS wave或者VS warp,并把它傳入shader中啟動執行。

     IA階段也會把draw中的primitive(體元)資訊傳到PA,以便把經過VS後的頂點裝配成為相應primitive。

     現在的shader幾乎都用的是統一架構shader block,即VS,PS,GS…等的執行都在一個block中。Shader啟動執行後,會從video memroy中取得頂點/執行個體資料和shader code,然後一條指令一條指令開始執行我們的VS code,執行後的結果會被傳送給PA。

      下面是一個簡單的vs執行的流程圖:

Directx11教程(15) D3D11管線(4)

本章我們了解IA階段GPU做的工作,下章我們将詳細了解VS shader中到底做了些什麼。

繼續閱讀