Common-Shader 核心

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

著色器階段中的資料流程圖

  • 輸入資料:頂點著色器會從輸入組合語言階段收到其輸入;幾何和圖元著色器會接收來自上一個著色器階段的輸入。 額外的輸入包括 系統值的語法,可供管線中的第一個單位取用。
  • 輸出資料:著色器會產生輸出結果,以傳遞至管線中的後續階段。 針對幾何著色器,單一調用的資料輸出數量可能會不同。 某些輸出會由常見的著色器核心 ((例如頂點位置和轉譯目標陣列索引) )來解讀,而其他輸出則是設計成由應用程式來解讀。
  • 著色器程式碼:著色器可以從記憶體讀取、執行向量浮點數、整數算數運算或流程式控制製作業。 在著色器中可執行檔語句數目沒有任何限制。
  • 取樣 器:取樣器定義如何取樣和篩選紋理。 最多可同時將16個取樣器系結至著色器。
  • 材質:紋理可以使用取樣器進行篩選,或使用 load 內建函數直接以每個材質為基礎來讀取。
  • 緩衝區:緩衝區永遠不會經過篩選,但是可以使用 load 內建函數,以每個元素為基礎來讀取緩衝區。 多達128的材質和緩衝區資源 (結合的) 可同時系結至著色器。
  • 常數緩衝區:常數緩衝區已針對著色器常數變數進行優化。 最多可以同時將16個常數緩衝區系結至著色器階段。 其設計目的是要從 CPU 進行較頻繁的更新;因此,它們具有額外的大小、配置和存取限制。
Direct3D 9 與 Direct3D 10 之間的差異:
在 Direct3D 9 中,每個著色器單位都有一個小型常數暫存器檔案,用來儲存所有常數著色器變數。 使用這個有限的常數空間來容納所有著色器,需要經常回收 CPU 的常數。
在 Direct3D 10 中,常數會儲存在記憶體中不可變的緩衝區,並如同其他任何資源一樣進行管理。 應用程式可以建立的常數緩衝區數目沒有任何限制。 藉由更新和使用頻率將常陣列織成緩衝區,更新常數以容納所有著色器所需的頻寬量將可大幅減少。

整數和位支援

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

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

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

位元運算子

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

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

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

二進位轉換

在整數和浮點類型之間進行轉換,將會在 C 截斷規則之後轉換數值。 將值從 float 轉換成 int,再轉換回 float ,是因為目標資料類型的有效位數而產生的失真轉換。 以下是一些轉換功能: asfloat (DIRECTX HLSL)ASINT (directx HLSL)asuint (directx HLSL)

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

著色器模型4