圖形管線

Direct3D 圖形管線專為即時遊戲應用程式產生圖形而設計。 透過每個可設定或可編程階段,從輸入到輸出的資料流。

所有階段都可以使用 Direct3D API 加以設定。 提供通用著色器核心 (圓角矩形區塊) 的階段,會使用 HLSL 程式設計語言進行程式設計。 這可賦予管線極大的彈性和適應能力。

最常用的兩個階段,分別是頂點著色器 (VS) 階段和像素著色器 (PS) 階段。 如果您並未提供上述著色器階段,則可使用預設的沒有任何作業、傳遞頂點和像素著色器等階段。

diagram of the data flow in the direct3d 11 programmable pipeline

輸入組合語言階段

輸入組合語言 (IA) 階段會將原始和相鄰資料提供給管線 (例如三角形、線條和點),包括語意 ID,有助於減少處理尚未處理的原始物件,從而提高著色器效率。

  • 輸入

    原始物件資料 (三角形、線條和/或點),來自記憶體中由使用者填滿的緩衝區。 這也有可能是相鄰資料。 三角形為每個三角形 3 個頂點,也有可能每個三角形 3 個相鄰的頂點。

  • 輸出

    隨附系統產生值的原始物件 (例如原始物件 ID、執行個體 ID 或頂點 ID)。

頂點著色器階段

頂點著色器 (VS) 階段會處理頂點,通常是藉由執行轉換、面板設定和照明之類的作業來處理。 頂點著色器會擷取單一輸入頂點,並產生單一輸出頂點。 個別的每一頂點作業,例如轉換、面板設定、變形和每一頂點照明。

  • 輸入

    單一頂點,隨附 VertexID 和 InstanceID 等系統產生的值。 每個頂點著色器輸入頂點可以包含多達 16 個 32 位元向量 (每個最多含有 4 個元件)。

  • 輸出

    單一頂點。 每個輸出頂點可以包含多達 16 個含有 4 個元件的 32 位元向量。

輪廓著色器階段

輪廓著色器 (HS) 階段 為其中一個鑲嵌式階段,能效率十足地將模型的單一表面劃分為多個三角形。 輪廓著色器會在每個填補中叫用一次,並將定義低序位表面的輸入控制點轉換為組成填補的控制點。 它也會進行一些以填補為基礎的計算,藉此為鑲嵌 (TS) 階段和網域著色器 (DS) 階段提供資料。

  • 輸入

    介於 1 個到 32 個輸入控制點之間,這些控制點會共同定義低序位表面。

  • 輸出

    介於 1 個到 32 個輸出控制點之間,這些控制點會共同組成填補。 輪廓著色器會宣告鑲嵌 (TS) 階段的狀態,包括控制點的數量、填補曲面的類型,以及鑲嵌時使用的資料分割類型。

鑲嵌階段

鑲嵌 (TS) 階段會建立代表幾何填補的網域取樣模式,並產生一組較小的物件 (三角形、點或線條),以連接這些樣本。

  • 輸入

    鑲嵌會使用鑲嵌係數 (指定網域將以何種精細度鑲嵌) 和磁碟分割類型 (指定用來進行填補配量的演算法),對每個填補進行一次操作。

  • 輸出

    鑲嵌會將 uv (以及選擇性的 w) 座標和表面拓撲輸出至網域著色器階段。

網域著色器階段

網域著色器 (DS) 階段 會定義輸出填補中的細分點頂點位置;它會計算對應至每個網域樣本的頂點位置。 網域著色器會在每個鑲嵌階段輸出點執行一次,且具有輪廓著色器輸出填補和輸出填補常數,以及鑲嵌階段輸出 UV 座標的唯讀存取權限。

  • 輸入

    網域著色器會使用來自輪廓著色器 (HS) 階段的輸出控制點。 輪廓著色器輸出會包括:控制點、填補常數資料,以及鑲嵌係數 (鑲嵌係數可包含固定函式鑲嵌使用的值,以及原始值,也就是整數鑲嵌四捨五入前的值,而這可用來輔助幾何變形等作業)。 網域著色器會針對來自鑲嵌 (TS) 階段的每個輸出座標叫用一次。

  • 輸出

    網域著色器 (DS) 階段會輸出輸出填補中的細分點頂點位置。

幾何著色器階段

幾何著色器 (GS) 階段會負責處理整個原始物件:三角形、線條、點及其相鄰頂點。 它可支援幾何放大和取消放大。 它對演算法而言相當實用,包括點原件展開、動態粒子系統、毛皮/魚鰭產生、陰影磁碟區產生、單通道轉譯至立方體貼圖、每一原始物件材質交換,以及每一原始物件材質設定 (包括產生重心座標,以做為原始物件資料,好讓像素著色器能執行自訂的屬性插補)。

  • 輸入

    不同於在單一頂點上運作的頂點著色器,幾何著色器的輸入為完整原始物件的頂點 (三角形為三個頂點、線條為兩個頂點,而點則為單一頂點)。

  • 輸出

    幾何著色器 (GS) 階段可輸出多個頂點,以形成單一選取拓撲。 可用的幾何著色器拓撲會包括 tristrip、linestrip 和 pointlist。 任何幾何著色器叫用中發出的原始物件數量可自由變化,不過,可發出之頂點數量上限,則必須透過靜態方式加以宣告。 幾何著色器叫用所發出的寬帶長度可以是任意長度,而新的寬帶則能透過 RestartStrip HLSL 函式建立。

資料流輸出階段

資料流輸出 (SO) 階段會持續將來自上一個作用中階段的頂點資料輸出 (或串流) 至記憶體中的一個或多個緩衝區。 串流到記憶體的資料可重新循環至管線,以做為輸入資料,或從 CPU 讀回。

  • 輸入

    來自上一個管線階段的頂點資料。

  • 輸出

    資料流輸出 (SO) 階段會持續將來自上一個作用中階段 (例如幾何著色器 (GS) 階段) 的頂點資料輸出 (或串流) 至記憶體中的一個或多個緩衝區。 如果幾何著色器 (GS) 階段為非作用中,且資料流輸出 (SO) 階段為作用中,它就會持續將來自網域著色器 (DS) 階段的頂點資料輸出至記憶體中的緩衝區 (或者,如果 DS 為非作用中,則輸入頂點著色器 (VS) 階段的資料)。

轉譯器階段

轉譯器 (RS) 階段會裁剪不在檢視中的原始物件、準備像素著色器的 (PS) 階段的原始物件,並判斷如何叫用像素著色器。 將向量資訊 (由圖形或原始物件組成) 轉換為點陣影像 (由像素組成),藉此顯示即時 3D 圖形。

  • 輸入

    假設來自轉譯器階段的頂點 (x,y,z,w) 會位於同質剪輯空間中。 在這個座標空間中,X 軸會指向右側、Y 軸會指向上方,而 Z 軸則會指向遠離相機的方向。

  • 輸出

    需要轉譯的實際像素。 包含供像素著色器用於插補中的部分頂點屬性。

像素著色器階段

像素著色器 (PS) 階段會收到原始物件的插補資料,並產生每一像素資料 (例如色彩)。

  • 輸入

    如果管線在未使用幾何著色器的情況下進行設定,則像素著色器僅限使用 16 個含有 4 個元件的 32 位元輸入。 否則,像素著色器最多可使用 32 個含有 4 個元件的 32 位元輸入。 像素著色器的輸入資料包含頂點屬性 (可在搭配或不搭配檢視方塊修正的情況下插補),或者可視為每一原始物件常數。 像素著色器輸入會根據宣告的插補模式,使用來自點陣化原始物件的頂點屬性進行插補。 如果原始物件在點陣化之前遭到裁剪,則裁剪程序期間也會採用插補模式。

  • 輸出

    像素著色器可輸出多達 8 個含有 4 個元件的 32 位元色彩,或在像素遭到捨棄時不輸出色彩。 像素著色器輸出暫存器元件必須在使用前宣告;每個暫存器都允許使用不同的輸出寫入遮罩。

輸出合併階段

輸出合併 (OM) 階段會結合多種類型的輸出資料 (像素著色器值、深度和樣板資訊) 和轉譯目標及深度/樣板緩衝區內容,以產生最終的管線結果。

  • 輸入

    輸出合併輸入包含管線狀態、像素著色器產生的像素資料、轉譯目標內容,以及深度/樣板緩衝區資料。

  • 輸出

    最終轉譯的像素色彩。