在 Direct3D 9 中使用著色器

編譯特定硬體的著色器

著色器第一次新增至 DirectX 8.0 中的 Microsoft DirectX。 此時已定義數部虛擬著色器機器,每個機器大致對應到前 3D 圖形廠商所產生的特定圖形處理器。 針對每個虛擬著色器機器,設計了元件語言。 撰寫至著色器模型的程式 (名稱vs_1_1和ps_1_1 - ps_1_4) 相對較短,且通常由開發人員直接以適當的元件語言撰寫。 應用程式會使用 D3DXAssembleShader 將這個人類可讀取的元件語言程式碼傳遞至 D3DX 程式庫,並取得著色器的二進位標記法,接著會使用 CreateVertexShaderCreatePixelShader傳遞。 如需詳細資訊,請參閱軟體發展工具組 (SDK) 。

Direct3D 9 的情況很類似。 應用程式會使用 D3DXCompileShader 將 HLSL 著色器傳遞至 D3DX,並取得編譯著色器的二進位標記法,接著會使用 CreatePixelShaderCreateVertexShader傳遞至 Microsoft Direct3D。 執行時間不知道有關 HLSL 的任何專案,只有二進位元件著色器模型。 這很好,因為它表示 HLSL 編譯器可以獨立于 Direct3D 執行時間進行更新。 您也可以使用 fxc離線編譯著色器。

除了開發 HLSL 編譯器之外,Direct3D 9 也引進了元件層級著色器模型,以公開最新一代圖形硬體的功能。 應用程式開發人員可以在這些新模型 (vs_2_0、vs_3_0、ps_2_0、ps_3_0) 中工作,但我們預期大部分開發人員都移至 HLSL 以進行著色器開發。

當然,撰寫 HLSL 程式來表示特定陰影演算法的能力,不會自動讓它在任何指定的硬體上執行。 應用程式會呼叫 D3DX,以使用 D3DXCompileShader將著色器編譯成二進位元件程式碼。 此進入點的其中一個限制是參數,定義哪些元件層級模型 (或編譯目標) HLSL 編譯器應該用來表示最終著色器程式碼。 如果應用程式在執行時間執行 HLSL 著色器編譯 (,而不是編譯時間或離線) ,則應用程式可以檢查 Direct3D 裝置的功能,並選取要比對的編譯目標。 如果以 HLSL 著色器表示的演算法太複雜,無法在選取的編譯目標上執行,編譯將會失敗。 這表示雖然 HLSL 對於著色器開發而言是極大的好處,但它不會讓開發人員從將遊戲寄送到具有不同功能的圖形裝置的目標物件釋出。 身為遊戲開發人員,您仍然需要管理視覺效果的階層式方法;這表示為更強大的圖形卡撰寫更好的著色器,以及撰寫較舊卡片的更多基本版本。 不過,使用妥善撰寫的 HLSL,可以大幅簡化此負擔。

許多開發人員選擇先從 HLSL 編譯 HLSL 著色器到二進位元件程式碼,而不是在第一次使用時,在客戶機器上使用 D3DX 編譯 HLSL 著色器。 這可讓 HLSL 原始程式碼遠離眼球,同時確保應用程式執行的所有著色器都經過其內部品質保證程式。 離線編譯著色器的便利公用程式是 fxc。 此工具有許多選項可供您用來編譯指定編譯目標的程式碼。 如果您想要優化著色器,或通常更詳細地瞭解虛擬著色器機器的功能,研究反組譯輸出在開發期間可能非常教育。 這些選項摘要如下:

初始化著色器常數

著色器常數包含在常數資料表中。 這可以使用 ID3DXConstantTable 介面來存取。 全域著色器變數可以在著色器程式碼中初始化。 這些會藉由呼叫 SetDefaults在執行時間初始化。

將著色器參數系結至特定暫存器

編譯器會自動將暫存器指派給全域變數。 編譯器會將 Environment 指派給 sampler register s0、SparkleNoise 至 sampler register s1,而k_s常數暫存器 c0 (假設下列三個全域變數尚未指派其他取樣器或常數暫存器) :

sampler Environment;
sampler SparkleNoise;
float4 k_s;

您也可以將變數系結至特定暫存器。 若要強制編譯器指派給特定暫存器,請使用下列語法:

register(RegisterName)

其中 RegisterName 是特定暫存器的名稱。 下列範例示範特定的暫存器指派語法,其中取樣器環境將系結至取樣器暫存器 s1、SparkleNoise 將會系結至取樣器暫存器暫存器 s0,而k_s會系結至常數暫存器 c12:

sampler Environment : register(s1);
sampler SparkleNoise : register(s0);
float4 k_s : register(c12);

轉譯可程式化著色器

著色器會藉由在裝置中設定目前的著色器、初始化著色器常數、告訴裝置來自不同的輸入資料,最後轉譯基本類型來轉譯著色器。 您可以分別呼叫下列方法來完成上述各項:

偵錯著色器

Microsoft Visual Studio .NET 的 DirectX 擴充功能是在 Visual Studio .NET 整合式開發環境內提供完全整合的 HLSL 偵錯工具, (IDE) 。 若要準備著色器偵錯,您必須在電腦上安裝正確的工具, (請參閱 在 Visual Studio 中偵錯著色器 (Direct3D 9) ) 。

HLSL 的程式設計指南