Common-Shader Core
在著色器模型 4 中,所有著色器階段都會使用通用著色器核心來實作相同的基底功能。 此外,這三個著色器階段中的每個階段(頂點、幾何和圖元)都提供每個階段特有的功能,例如能夠從幾何著色器階段產生新的基本類型,或捨棄圖元著色器階段中的特定圖元。 下圖顯示數據如何流經著色器階段,以及 Common-Shader 核心與著色器記憶體資源的關聯性。
- 輸入數據:頂點著色器會從輸入組合器階段接收其輸入;幾何和圖元著色器會從上一個著色器階段接收其輸入。 其他輸入包括 系統值語意,這些語意是由管線中適用之第一個單位所取用。
- 輸出數據:著色器會產生輸出結果,以傳遞至管線中的後續階段。 對於幾何著色器,單一調用的數據輸出量可能會有所不同。 某些輸出是由通用著色器核心解譯的(例如頂點位置和轉譯目標陣列索引),其他輸出則設計成由應用程式解譯。
- 著色器程式代碼:著色器可以從記憶體讀取、執行向量浮點數和整數算術運算,或流程控制作業。 在著色器中實作的語句數目沒有限制。
- 取樣器:取樣器會定義如何取樣和篩選紋理。 多達16個取樣器可以同時系結至著色器。
- 紋理:紋理可以使用取樣器進行篩選,或使用負載內部函數直接以每個材質為基礎讀取。
- 緩衝區:一律不會篩選緩衝區,但可以直接使用載入內部函數,從記憶體讀取每個元素。 多達128個紋理和緩衝區資源(結合)可以同時系結至著色器。
- 常數緩衝區:常數緩衝區已針對著色器常數變數進行優化。 多達16個常數緩衝區可以同時系結至著色器階段。 其設計目的是要從 CPU 進行更頻繁的更新;因此,它們有額外的大小、配置和存取限制。
Direct3D 9 與 Direct3D 10 之間的差異:
- 在 Direct3D 9 中,每個著色器單位都有單一小型常數緩存器檔案來儲存所有常數著色器變數。 容納具有這個有限常數空間的所有著色器,需要CPU經常回收常數。
- 在 Direct3D 10 中,常數會儲存在記憶體中的不可變緩衝區中,並像任何其他資源一樣管理。 應用程式可以建立的常數緩衝區數目沒有限制。 藉由依更新和使用頻率將常數組織成緩衝區,可以大幅降低更新常數以容納所有著色器所需的頻寬量。
整數和位支援
常見的著色器核心提供一組符合 IEEE 規範的 32 位整數和位運算。 這些作業會在圖形硬體範例中啟用新的演算法類別,包括壓縮和封裝技術、FFT 和 bitfield 程式流程控制。
Direct3D 10 HLSL 中的 int 和 uint 數據類型會對應至硬體中的 32 位整數。
Direct3D 9 與 Direct3D 10 之間的差異: 在 Direct3D 9 數據流輸入中,標記為 HLSL 中的整數會解譯為浮點。 在 Direct3D 10 中,標示為整數的數據流輸入會解譯為 32 位整數。 此外,布爾值現在是設定所有位或所有位未設定。 如果值不等於 0.0f,則轉換成 bool 的數據將會解譯為 true(正零和負零都允許為 false),否則為 false。 |
位元運算子
常見的著色器核心支援下列位運算子:
運算子 | 函式 |
---|---|
~ | 邏輯 Not |
<< | 左移 |
>> | 右移 |
& | 邏輯和 |
| | 邏輯或 |
^ | 邏輯 Xor |
<<= | 左移等於 |
>>= | 右移等於 |
&= | 和等於 |
|= | 或等於 |
^= | Xor Equal |
位運算子會定義為只在 int 和 uint 資料類型上運作。 嘗試在 float 或 struct 資料類型上使用位運算子會導致錯誤。 位運算子遵循與其他運算符相同的 C 優先順序。
二進位轉換
整數與浮點類型之間的轉換將會轉換 C 截斷規則后的數值。 將值從 float、轉換成 int,然後轉換回 float 是相依於目標數據類型精確度的遺失轉換。 以下是一些轉換函式:asfloat (DirectX HLSL)、asint (DirectX HLSL)、asuint (DirectX HLSL) 。
二進位轉換也可以使用 HLSL 內部函數來執行。 這些會導致編譯程式將數位的位表示重新解譯成目標數據類型。