Common-Shader核心

在著色器模型 4 中,所有著色器階段都會使用通用著色器核心來實作相同的基底功能。 此外,三個著色器階段 (頂點、幾何和圖元) 提供每個階段特有的功能,例如能夠從幾何著色器階段產生新的基本類型,或捨棄圖元著色器階段中的特定圖元。 下圖顯示資料如何流經著色器階段,以及一般著色器核心與著色器記憶體資源的關聯性。

diagram of data flow in a shader stage

  • 輸入資料:頂點著色器會從輸入組合器階段接收其輸入;geometry 和圖元著色器會從先前的著色器階段接收其輸入。 其他輸入包括 系統值語意,這些語意可由管線中適用的第一個單位取用。
  • 輸出資料:著色器會產生輸出結果,以傳遞至管線中的後續階段。 針對幾何著色器,單一調用的資料輸出量可能會有所不同。 某些輸出會由通用著色器核心 (解譯,例如頂點位置和轉譯目標陣列索引) ,其他輸出則設計成由應用程式解譯。
  • 著色器程式碼:著色器可以從記憶體讀取、執行向量浮點數和整數算數運算,或流程式控制製作業。 在著色器中實作的語句數目沒有限制。
  • 取樣器:取樣器會定義如何取樣和篩選紋理。 最多可同時系結到著色器 16 個取樣器。
  • 紋理:可以使用取樣器篩選紋理,或使用 負載 內建函式直接以每個材質讀取。
  • 緩衝區:永遠不會篩選緩衝區,但可以直接使用 載入 內建函式,從記憶體讀取每個元素。 結合) 可以同時系結至著色器 (128 個紋理和緩衝區資源。
  • 常數緩衝區:常數緩衝區已針對著色器常數變數進行優化。 可以同時系結至著色器階段的 16 個常數緩衝區。 其設計目的是要從 CPU 進行更頻繁的更新;因此,它們具有額外的大小、配置和存取限制。

Direct3D 9 與 Direct3D 10 之間的差異:

  • 在 Direct3D 9 中,每個著色器單位都有一個小型常數暫存器檔案來儲存所有常數著色器變數。 容納所有具有此有限常數空間的著色器,需要 CPU 經常回收常數。
  • 在 Direct3D 10 中,常數會儲存在記憶體中的不可變緩衝區中,並像任何其他資源一樣管理。 應用程式可以建立的常數緩衝區數目沒有限制。 藉由依更新和使用頻率將常陣列織成緩衝區,可以大幅減少更新常數以容納所有著色器所需的頻寬量。

整數和位支援

常見的著色器核心提供一組完整的 IEEE 相容 32 位整數和位運算。 這些作業會在圖形硬體範例中啟用新的演算法類別,包括壓縮和封裝技術、FFF 和 bitfield 程式流程式控制制。

Direct3D 10 HLSL 中的 intuint 資料類型會對應至硬體中的 32 位整數。

Direct3D 9 與 Direct3D 10 之間的差異:
在 HLSL 中標示為整數的 Direct3D 9 資料流程輸入,會解譯為浮點數。 在 Direct3D 10 中,標示為整數的資料流程輸入會解譯為 32 位整數。
此外,布林值現在是所有位設定或未設定的所有位。 如果值不等於 0.0f,則轉換成 bool 的資料會解譯為 true, (允許正零和負零為 false) ,否則為 false。

位元運算子

常見的著色器核心支援下列位運算子:

運算子 函式
~ 邏輯 Not
<< 左移
>> 右移
& 邏輯 And
| 邏輯 Or
^ 邏輯 Xor
<<= 左移等於
>>= 右移等於
&= 和 相等
|= 或等於
^= Xor Equal

位運算子會定義為只在 intuint 資料類型上運作。 嘗試在 floatstruct 資料類型上使用位運算子會導致錯誤。 位運算子會遵循與其他運算子相同的優先順序 C。

二進位轉換

在整數與浮點類型之間轉換,將會轉換 C 截斷規則後面的數值。 將值從 floatint 轉換為 int,然後轉換回 float 是相依于目標資料類型精確度的遺失轉換。 以下是一些轉換函式: asfloat (DirectX HLSL) asint (DirectX HLSL) asuint (DirectX HLSL)

您也可以使用 HLSL 內建函式來執行二進位轉換。 這些會導致編譯器將數位的位表示重新解譯成目標資料類型。

著色器模型 4