DX11エフェクトシステム作成 Part3 変数情報取得

コンパイルしたシェーダバイナリコードから使用されている変数の情報を取得します。ただしEffects11のような複雑(詳細)な情報ではなく必要最小限の情報のみ扱います。


シェーダにおける変数

行列などの変数の扱い方は、定数バッファが採用されたことで大きく変わっています。以前(DX9とか)は、少ない定数レジスタを効率よく使用するために不要な変数が削除されるため、値の更新が面倒でした。定数バッファでは容量に余裕があるため、不要な変数は削除されず、値の更新が簡単です(構造体をそのままコピーできる)。
D3DXのエフェクトは以前の面倒な変数の更新をやってくれていましたが、定数バッファによって必要性が薄れたような気がします(SDKから外された理由?)。

取得する変数情報は、リソース(定数バッファ、テクスチャ、サンプラ)に割り当てられたスロット番号のみになります。ちなみに、定数バッファ単位で未使用なものは割り当てから除外されます。

リソースへのスロット番号の割り当て仕様

基本的な割り当て
シェーダで利用されているものにだけスロット番号が割り当て。定義順に0番から割り当て(仕様?)。

register()で番号指定
register定義を使用することでスロット番号を明示的に割り当てることが可能。

register有無の混合
registerでスロット番号指定した場合、使用の有無にかかわらず番号が予約される。registerなしのリソースは、予約されていない番号が割り当てられる。

配列定義
定数バッファは配列不可。それ以外のリソースは配列定義できるが、利用に制限あり。

この場合
txDiffuse[0] txDiffuse[1] txDiffuse[2]
という個別の変数として扱われる。ただしスロット番号は連続した番号が使用の有無にかかわらず割り当てられる。例として[1]が未使用でも[0]に0番、[2]に2番の割り当て。
もう一つ制限として、テクスチャなどのリソース変数は配列の添字に変数を使用できない。

cbufferなしの変数定義
自動的に定数バッファが割り当てられる。現環境では”$Grobals”という定数バッファが作成されている。それと未使用の変数でも削除されない。


シェーダ変数の情報取得

コンパイルされたシェーダバイナリコードからID3D11ShaderReflectionインターフェイスを作成、取得。

シェーダ入力パラメータ情報取得

割り当てられたスロット番号取得

定数バッファの変数定義詳細

不要かもしれない。
ID3D11ShaderReflectionからID3D11ShaderReflectionConstantBuffer、ID3D11ShaderReflectionVariableを取得して変数定義の詳細が得られる。


サンプルプログラム

エフェクトシステム作成 Part3 変数情報取得
DX11エフェクトシステム作成 Part3 変数情報取得

今回作成した追加機能
シェーダ入力とリソースのスロット番号情報をパス情報に追加。単純な構造体の配列のみ。ID3D11ShaderReflectionで得られる情報を事前に取得しておく。

サンプラ定義について
サンプラステートの定義を

のようできるので、サンプラの設定を行うように見えますがシェーダにそのような機能はありません。定義内容は無視されます。自分で指定されたスロット番号にID3D11SamplerStateを設定する必要があります。今回作成しているエフェクトシステムは、この定義内容を保持取得できるようにしています。その時の取得するための情報がResourceDesc::idxDesc。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.