Direct3D 9 でのシェーダーの使用
- 特定のハードウェアのシェーダーのコンパイル
- シェーダー定数の初期化
- シェーダー パラメーターを特定のレジスタにバインドする
- プログラミング可能なシェーダーのレンダリング
- シェーダーのデバッグ
- 関連トピック
特定のハードウェアのシェーダーのコンパイル
シェーダーは、DirectX 8.0 の Microsoft DirectX に最初に追加されました。 その時点で、いくつかの仮想シェーダー マシンが定義され、それぞれが上位 3D グラフィックス ベンダーによって生成された特定のグラフィックス プロセッサにほぼ対応していました。 これらの仮想シェーダー マシンごとに、アセンブリ言語が設計されました。 シェーダー モデルに書き込まれたプログラム (名前vs_1_1とps_1_1 - ps_1_4) は比較的短く、通常は開発者が適切なアセンブリ言語で直接記述していました。 アプリケーションは、この人間が判読できるアセンブリ言語コードを D3DXAssembleShader を使用して D3DX ライブラリに渡し、シェーダーのバイナリ表現を取得し、 CreateVertexShader または CreatePixelShader を使用して渡されます。 詳細については、ソフトウェア開発キット (SDK) を参照してください。
Direct3D 9 の状況は似ています。 アプリケーションは、 D3DXCompileShader を使用して HLSL シェーダーを D3DX に渡し、コンパイルされたシェーダーのバイナリ表現を取得します。このシェーダーは、 CreatePixelShader または CreateVertexShader を使用して Microsoft Direct3D に渡されます。 ランタイムは HLSL について何も知らず、バイナリ アセンブリ シェーダー モデルのみを認識します。 これは、DIRECT3D ランタイムに関係なく HLSL コンパイラを更新できることを意味するため、便利です。 fxc を使用してシェーダーをオフラインでコンパイルすることもできます。
Direct3D 9 では、HLSL コンパイラの開発に加えて、最新世代のグラフィックス ハードウェアの機能を公開するアセンブリ レベルのシェーダー モデルも導入されました。 アプリケーション開発者は、これらの新しいモデル (vs_2_0、vs_3_0、ps_2_0、ps_3_0) のアセンブリで作業できますが、ほとんどの開発者はシェーダー開発のために HLSL に移行することを期待しています。
もちろん、特定のシェーディング アルゴリズムを表現する HLSL プログラムを記述する機能では、特定のハードウェアで実行することは自動的には有効になりません。 アプリケーションは D3DX を呼び出して、 D3DXCompileShader を使用してシェーダーをバイナリ アセンブリ コードにコンパイルします。 このエントリ ポイントの制限事項の 1 つは、HLSL コンパイラが最終的なシェーダー コードを表現するために使用するアセンブリ レベル モデル (またはコンパイル ターゲット) を定義するパラメーターです。 アプリケーションが実行時 (コンパイル時またはオフラインではなく) HLSL シェーダーコンパイルを実行している場合、アプリケーションは Direct3D デバイスの機能を調べて、一致するコンパイル ターゲットを選択できます。 HLSL シェーダーで表されるアルゴリズムが複雑すぎて、選択したコンパイル ターゲットで実行できない場合、コンパイルは失敗します。 つまり、HLSL はシェーダー開発にとって大きな利点ですが、さまざまな機能を備えたグラフィックス デバイスを持つターゲットユーザーにゲームを配布する現実から開発者を解放するわけではありません。 ゲーム開発者は、ビジュアルに対する階層化されたアプローチを管理する必要があります。これは、より優れたグラフィックス カード用に優れたシェーダーを記述し、古いカードのより基本的なバージョンを書き込むという意味です。 しかし、適切に記述された HLSL を使用すると、この負担を大幅に軽減できます。
多くの開発者は、アプリケーションの読み込み時または初回使用時に D3DX を使用して HLSL シェーダーをコンパイルするのではなく、出荷する前に HLSL からバイナリ アセンブリ コードにシェーダーをコンパイルすることを選択します。 これにより、HLSL ソース コードが詮索好きな目から離れ、アプリケーションが実行されるすべてのシェーダーが内部の品質保証プロセスを経たことも保証されます。 シェーダーをオフラインでコンパイルするための便利なユーティリティは fxc です。 このツールには、指定したコンパイル ターゲットのコードをコンパイルするために使用できるさまざまなオプションがあります。 シェーダーを最適化する場合や、一般的に仮想シェーダー マシンの機能をより詳細なレベルで把握したい場合は、開発時に逆アセンブルされた出力を調べるのは非常に教育的です。 これらのオプションの概要を次に示します。
シェーダー定数の初期化
シェーダー定数は定数テーブルに含まれています。 これは 、ID3DXConstantTable インターフェイスを使用してアクセスできます。 グローバル シェーダー変数は、シェーダー コードで初期化できます。 これらは実行時に SetDefaults を呼び出して初期化されます。
シェーダー パラメーターを特定のレジスタにバインドする
コンパイラは、グローバル変数にレジスタを自動的に割り当てます。 コンパイラは、次の 3 つのグローバル変数に対して Environment をサンプラー レジスタ s0 に割り当て、スパークルノワーズをサンプラー レジスタ s1 に割り当て、定数レジスタ c0 にk_sします (他のサンプラーまたは定数レジスタが既に割り当てられていない場合)。
sampler Environment;
sampler SparkleNoise;
float4 k_s;
また、変数を特定のレジスタにバインドすることもできます。 コンパイラが特定のレジスタに強制的に割り当てるには、次の構文を使用します。
register(RegisterName)
ここで、RegisterName は特定のレジスタの名前です。 次の例は、サンプラー環境がサンプラー レジスタ s1 にバインドされ、スパークルノワーズがサンプラー レジスタ 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 統合開発環境 (IDE) 内に完全に統合された HLSL デバッガーを提供します。 シェーダーのデバッグを準備するには、マシンに適切なツールをインストールする必要があります ( 「Visual Studio でのシェーダーのデバッグ (Direct3D 9)」を参照してください)。
関連トピック