2017-02-22 18 views
1

コンパイル済みのシェーダを使用し、リフレクションを使用して頂点シェーダの入力レイアウトを自動的に生成するDirectXコードをいくつか記述しようとしています。私は、これはそれが受け付ける入力され、インスタンス化を利用するように設計されたシンプルな頂点シェーダーを持っている:DirectX 11頂点シェーダリフレクション

struct VertexIn 
{ 
    // Per-vertex data 
    float3 pos  : POSITION; 
    float4 color : COLOR; 

    // Per-instance data 
    matrix worldMatrix : WORLDMATRIX; 
}; 

そして、私のレイアウト、私は手でそれを書くとしたら、次のようになります。

// Per-vertex data 
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
// Per-instance data. 
{ "WORLDMATRIX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, 
{ "WORLDMATRIX", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 } 
私はコンパイルされたシェーダを反映すると

は、私は、入力パラメータの正しい数を取得するが、私はD3D11_SIGNATURE_PARAMTER_DESCを介して入力の説明を読んしようとすると、私はD3D11_INPUT_ELEMENT_DESCメンバーInputSlotInputSlotClassInstanceDataStepRateを埋めるために必要な詳細情報を見つけることができませんか?この情報について間違った説明を探しているのですか、または反映によって不可能な詳細をインスタンス化していますか?

これが可能でない場合は、予想される頂点の入力レイアウトを渡してすべてのパラメータをチェックすることが他の唯一の選択肢だと思いますか?

答えて

1

InputSlot,InputSlotClassおよびInstanceDataStepRateの値が、頂点シェーダのみで与えられるべきであることを知ることはできません。データバインディングとデータ処理の問題です。頂点シェーダはデータを処理しますが、入力レイアウトはデータがシェーダにどのように供給されるかを定義します。

たとえば、シェーダーの入力定義を見ると、worldMatrixがインスタンス単位のメンバーであること(コメント以外)は表示されません。実際には、同じ頂点シェーダコードを使用して、インスタンスごとのデータではなく、入力レイアウトと頂点バッファバインディングを簡単に作成できます。

代わりに、シェーダコード内にセマンティック命名規則を作成して、入力レイアウトの値がどのようにインスタンス化されるか、およびインスタンス化の進歩率を指示することができます。たとえば、次のようになります。

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1; 

セマンティックを解析すると、入力されたスロットとステップレートがインスタンス化されます。しかし、そのようなスキームは価値があるよりももっと難しいかもしれません。ある時点で、どのような入力データがあるか、それをどのシェードにバインドして入力レイアウトを決定するかを知る必要があります。

+0

ああ、それはシェイダー自体のコメントに関する公正な点ですが、実際にはスロット番号について何も言及していません。私はセマンティックなアイデアが好きで、試してみるかもしれない。あなたは、入力データが何であるかを知る必要があると言いますが、その意味は何ですか? IASetVertexBuffersなどの呼び出し? – TheRarebit

+0

はい、私はあなたが持っている頂点データ(例えば、IASetVertexBuffersで設定されたもの)を知る必要があることを意味しました。シェーダにスキームを定義して、最終的に頂点データを持つ必要があることを定義することもできますが、 – MuertoExcobito

+0

ええ、私は理解しています。すべてが自動化できるわけではありません。私は、入力レイアウトの生成が自動化されているというアイデアが好きです。フィードバックのための歓声。 – TheRarebit

関連する問題