輪廓著色器 (HS) 階段
輪廓著色器 (HS) 階段 為其中一個鑲嵌式階段,能效率十足地將模型的單一表面劃分為多個三角形。 輪廓著色器 (HS) 階段會產生對應至每個輸入填補 (四邊形、三角形或線條) 的幾何填補 (和填補常數)。 輪廓著色器會在每個填補中叫用一次,並將定義低序位表面的輸入控制點轉換為組成填補的控制點。 它也會進行一些以填補為基礎的計算,藉此為鑲嵌 (TS) 階段和網域著色器 (DS) 階段提供資料。
用途和使用方式
三個鑲嵌階段會搭配運作,藉此將高階表面 (可讓模型保持簡單且效率十足) 轉換為多個三角形,以利在圖形管線中進行詳細的轉譯。 鑲嵌階段包含輪廓著色器 (HS) 階段、鑲嵌 (TS) 階段,以及網域著色器 (DS) 階段。
輪廓著色器 (HS) 階段是可進行程式設計的著色器階段。 輪廓著色器會使用 HLSL 函式實作。
輪廓著色器作業可劃分為兩個階段:控制點階段和填補常數階段,兩個階段都會由硬體來平行執行。 HLSL 編譯器會擷取輪廓著色器中的平行處理原則,並將其編碼為可驅動硬體的位元組程式碼。
- 控制點階段會操作每個控制點一次,藉此讀取填補的控制點,並產生一個輸出控制點 (由 ControlPointID 識別)。
- 填補常數階段會操作每個填補一次,以產生邊緣鑲嵌係數和其他每一填補常數。 內部可能會同時執行許多填補常數階段。 填補常數階段具備所有輸入和輸出控制點的唯讀存取權限。
輸入
介於 1 個到 32 個輸入控制點之間,這些控制點會共同定義低序位表面。
- 輪廓著色器會宣告鑲嵌 (TS) 階段所要求的狀態。 這會包括控制點的數量、填補曲面的類型,以及鑲嵌時使用的資料分割類型等資訊。 通常,這項資訊會顯示為著色器程式碼前端的宣告。
- 鑲嵌係數會判斷每個填補有多少個細分項目。
輸出
介於 1 個到 32 個輸出控制點之間,這些控制點會共同組成填補。
- 無論鑲嵌係數的數量為何,著色器輸出都會介於 1 個到 32 個控制點之間。 來自輪廓著色器的控制點輸出可提供給網域著色器階段使用。 填補常數資料可提供給網域著色器使用。 鑲嵌係數可提供給鑲嵌 (TS) 階段和網域著色器 (DS) 階段使用。
- 如果輪廓著色器將任何邊緣鑲嵌係數設為 ≤ 0 或 NaN,則填補會遭到剔除 (忽略)。 因此,鑲嵌階段可能或可能不會執行、網域著色器將不會執行,且不會針對該填補產生任何可見的輸出。
範例
[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
InputPatch<MyInPoint, 12> InPts)
{
MyOutPoint result;
...
result = TransformControlPoint( InPts[Id] );
return result;
}
詳情請參閱操作說明:建立輪廓著色器。
相關主題