共用方式為


鑲嵌階段

Direct3D 11 運行時間支持實作鑲嵌式的三個新階段,可將低詳細數據細分介面轉換成 GPU 上的較高詳細數據基本類型。 鑲嵌圖格(或分解)高階表面成適合轉譯的結構。

藉由在硬體中實作鑲嵌,圖形管線可以評估較低的詳細數據(較低多邊形計數)模型,並以較高的詳細數據呈現。 雖然可以完成軟體鑲嵌,但硬體所實作的鑲嵌可能會產生令人難以置信的視覺詳細數據量(包括位移對應支援),而不需要將視覺詳細數據新增至模型大小和癱瘓的重新整理速率。

鑲嵌權益

棋盤形佈置:

  • 節省大量的記憶體和頻寬,這可讓應用程式從低解析度模型轉譯更詳細的表面。 Direct3D 11 管線中實作的鑲嵌技術也支援位移對應,這可以產生驚人的表面細節量。
  • 支援可調整的轉譯技術,例如可實時計算的連續或檢視相依層級詳細數據。
  • 以較低的頻率執行昂貴的計算來改善效能(在較低詳細數據模型上執行計算)。 這可能包括使用混合圖形或變形目標進行混合計算,以進行實際動畫或物理計算,以進行碰撞偵測或軟體動態。

Direct3D 11 管線會在硬體中實作鑲嵌,以將工作從 CPU 卸除至 GPU。 如果應用程式實作大量的變形目標和/或更複雜的外觀/變形模型,這可能會導致非常大的效能改善。 若要存取新的鑲嵌功能,您必須瞭解一些新的管線階段。

新的管線階段

鑲嵌會使用 GPU,從從四邊形修補程式、三角形修補程式或等線建構的介面計算更詳細的表面。 為了近似高排序表面,每個修補程式都會使用鑲嵌因數細分成三角形、點或線條。 Direct3D 11 管線會使用三個新的管線階段來實作鑲嵌:

  • Hull-Shader 階段 - 可程式化的著色器階段,會產生對應至每個輸入修補程式(四邊形、三角形或線條)的幾何修補(和修補常數)。
  • 鑲嵌式階段 - 固定函式管線階段,可建立代表幾何修補的網域取樣模式,併產生一組連接這些樣本的較小物件(三角形、點或線條)。
  • Domain-Shader 階段 - 可程式化著色器階段,可計算對應至每個定義域範例的頂點位置。

下圖醒目提示 Direct3D 11 管線的新階段。

direct3d 11 管線的圖表,以醒目提示船體著色器、鑲嵌器和領域著色器階段

下圖顯示鑲嵌階段的進展。 進展是從低細節細分表面開始。 接下來會反白顯示輸入修補程式,其中包含連接這些樣本的對應幾何修補程式、領域樣本和三角形。 進展最後會反白顯示對應至這些樣本的頂點。

鑲嵌進展 圖表

Hull-Shader 階段

每個修補程式叫用一次的殼體著色器,會將定義低序表面的輸入控制點轉換成組成修補程式的控制點。 它也會針對每個修補計算執行一些工作,以提供鑲嵌階段和網域階段的數據。 在最簡單的黑箱層級,船體著色器階段看起來會像下圖一樣。

船體著色器階段 圖表

船體著色器是使用 HLSL 函式實作,並具有下列屬性:

  • 著色器輸入介於 1 到 32 個控制點之間。
  • 著色器輸出介於 1 到 32 個控制點之間,不論鑲嵌因數的數目為何。 網域著色器階段可以使用船體著色器的控制點輸出。 網域著色器可以使用修補常數數據;定義域著色器和鑲嵌階段可以使用鑲嵌因數。
  • 鑲嵌因素會決定要細分每個修補程式多少。
  • 著色器會宣告鑲嵌器階段所需的狀態。 這包括控制點數目、修補面類型,以及鑲嵌時要使用的分割類型等資訊。 此資訊通常會在著色器程式代碼前面顯示為宣告。
  • 如果船體著色器階段將任何邊緣鑲嵌因數設定為 = 0 或 NaN,則修補將會被撲殺。 因此,鑲嵌器階段可能或可能不會執行,網域著色器將不會執行,而且不會針對該修補程式產生任何可見的輸出。

在更深的層級上,船體著色器實際上會以兩個階段運作:控制點階段和修補程式常數階段,硬體會平行執行。 HLSL 編譯程式會擷取殼層著色器中的平行處理原則,並將它編碼為驅動硬體的位元組程序代碼。

  • 控制點階段會針對每個控制點作一次,讀取修補程式的控制點,併產生一個輸出控制點(由 ControlPointID 識別)。
  • 修補程式常數階段會為每個修補程序運作一次,以產生邊緣鑲嵌因數和其他每個修補程式常數。 在內部,許多修補程式常數階段可能會同時執行。 修補程式常數階段具有所有輸入和輸出控制點的唯讀存取權。

以下是船體著色器的範例:

[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
     InputPatch<MyInPoint, 12> InPts)
{
     MyOutPoint result;
     
     ...
     
     result = TransformControlPoint( InPts[Id] );

     return result;
}

如需建立輪廓著色器的範例,請參閱 如何:建立船體著色器

鑲嵌式階段

鑲嵌器是固定函式階段,由將船體著色器系結至管線來初始化(請參閱 How To: Initialize the Tessellator Stage)。 鑲嵌器階段的目的是將定義域(四邊形、三角或線條)細分成許多較小的物件(三角形、點或線條)。 鑲嵌器會在正規化(零對一)座標系統中,並排顯示標準域。 例如,四方域會鑲嵌成單位平方。

鑲嵌器會使用鑲嵌因數(指定如何精細地鑲嵌定義域)和分割類型(指定用來從船體著色器階段傳入的演算法,針對每個修補程式執行一次鑲嵌式運算)。每個修補程式都會運作一次。 鑲嵌器會將 uv (以及選擇性 w) 座標和表面拓撲輸出到領域著色器階段。

在內部,鑲嵌器會以兩個階段運作:

  • 第一階段會使用 32 位浮點算術處理鑲嵌因數、修正四捨五入問題、處理非常小的因素、減少和結合因數。
  • 第二個階段會根據選取的數據分割類型來產生點或拓撲清單。 這是鑲嵌器階段的核心工作,並使用具有固定點算術的 16 位分數。 固定點算術允許硬體加速,同時維持可接受的精確度。 例如,假設有64公尺寬的修補程式,此精確度可以放置2公厘解析度的點。
數據分割的類型 範圍
fractional_odd [1...63]
fractional_even TessFactor 範圍:[2..64]
整數 TessFactor 範圍:[1..64]
pow2 TessFactor 範圍:[1..64]

Domain-Shader 階段

定義域著色器會計算輸出修補程式中子點的頂點位置。 定義域著色器會根據鑲嵌器階段輸出點執行一次,而且具有鑲嵌器階段輸出 UV 座標、船體著色器輸出修補程式和船體著色器輸出修補常數的只讀存取權,如下圖所示。

網域著色器階段圖表

網域著色器的屬性包括:

  • 定義域著色器會在鑲嵌器階段的每個輸出座標叫用一次。
  • 網域著色器會從船體著色器階段取用輸出控制點。
  • 定義域著色器會輸出頂點的位置。
  • 輸入是船體著色器輸出,包括控制點、修補常數數據和鑲嵌因數。 鑲嵌因數可以包含固定函數鑲嵌器所使用的值,以及原始值(例如,以整數鑲嵌進行四捨五入之前),這可促進地貌的地貌。

網域著色器完成之後,鑲嵌完成,管線數據會繼續下一個管線階段(幾何著色器、圖元著色器等)。 幾何著色器,預期具有相鄰的基本類型(例如,每個三角形有 6 個頂點)在鑲嵌作用中時無效(這會導致未定義的行為,偵錯層會抱怨這種行為)。

以下是網域著色器的範例:

void main( out    MyDSOutput result, 
           float2 myInputUV : SV_DomainPoint, 
           MyDSInput DSInputs,
           OutputPatch<MyOutPoint, 12> ControlPts, 
           MyTessFactors tessFactors)
{
     ...

     result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}

初始化鑲嵌階段的 API

鑲嵌是使用兩個新的可程式化著色器階段來實作:船體著色器和領域著色器。 這些新的著色器階段是以著色器模型 5 中定義的 HLSL 程式代碼進行程序設計。 新的著色器目標為:hs_5_0和ds_5_0。 如同所有可程式化著色器階段,當著色器使用 DSSetShaderHSSetShader等 API 系結至管線時,硬體的程式代碼會從傳入運行時間的已編譯著色器擷取。 但首先,必須使用 CreateHullShaderCreateDomainShader等 API 來建立著色器。

藉由建立船體著色器並將其系結至船體著色器階段來啟用鑲嵌(這會自動設定鑲嵌器階段)。 若要從鑲嵌式修補程式產生最終頂點位置,您也必須建立網域著色器,並將它系結至網域著色器階段。 啟用鑲嵌之後,輸入組合器階段的數據輸入必須是修補數據。 也就是說,輸入組譯工具拓撲必須是來自具有 IASetPrimitiveTopologyD3D11_PRIMITIVE_TOPOLOGY 集的修補程式常數拓撲。

若要停用鑲嵌,請將輪廓著色器和網域著色器設定為 NULL。 幾何著色器階段和數據流輸出階段都無法讀取船體著色器輸出控制點或修補數據。

作法:

檔也包含初始化鑲嵌階段的範例。

專案 描述
如何:建立輪廓著色器
建立輪廓著色器。
作法:設計輪廓著色器
設計船體著色器。
如何:初始化鑲嵌式階段
初始化鑲嵌階段。
如何:建立網域著色器
建立網域著色器。
如何:設計網域著色器
建立網域著色器。

圖形管線