本章我們首先了解一下D3D11中的邏輯管線,認識一下管線中每個stage的含義。
D3D11邏輯管線如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukjMxQjZlZmYwATO2kTZwkjYmhTMyEmM5EWYlZWZ2YWNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
首先,我們來學習一下每個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執行的流程圖:
本章我們了解IA階段GPU做的工作,下章我們将詳細了解VS shader中到底做了些什麼。