XNAのバックグラウンドを持って、私は単純なDirectX11アプリケーションを作成しようとしています。ここで、射影行列などのシェーダー定数を設定する方法を理解しようとしています。定数バッファーについて読んでいますが、バッファーを使用せずに、レンダリング前にいくつかの定数を設定する簡単な方法はありませんか?
2 に答える
私も同じ道を歩んでいますが、これも私が苦労していることです。DirectX10以降、インターフェイスに多くの変更が加えられ、より全体的な制御が可能になりました。
遅かれ早かれ、あなたはバッファに慣れて、それらが実際にかなりきちんとしていることに気付くでしょう。
ここにいくつかの利点とヒントがあります:
頂点、インデックス、定数データをパイプライン、つまり
Buffer
クラスにバインドする統一された方法があります。定数はレジスタにパックされ、それぞれが最大4つの32ビットコンポーネントを保持します。
HLSL関数を使用して、定数を手動でパックできます。考慮しなければならないいくつかのルール
packoffset()
があります。複数の定数バッファーを単一のステージにバインドできるため、定数を更新頻度で区切ることをお勧めします。たとえば、ビューとプロジェクションのマトリックスは通常、フレームごとに1回更新されますが、ワールドマトリックスはメッシュごとに変更されます。最適なパフォーマンスを得るには、2つのバッファを作成します。1つはフレームごとのデータを含み、もう1つはメッシュデータごとに含まれます。
最後に、定数バッファーの制限:
各定数バッファーは、最大4096個のベクトルを保持できます。各ベクトルには、最大4つの32ビット値が含まれます。パイプラインステージごとに最大14個の定数バッファーをバインドできます(2つの追加スロットは内部使用のために予約されています)。
DirectX11 では、シェーダーに定数バッファーを設定します。一度に 1 つの定数のみを設定することはできません。一度に設定できるのはバッファ全体だけです。定数バッファーを使用するか、Effects11 フレームワークを調べて、シェーダー定数の API を使いやすくします (D3D9 効果と同様)。
定数バッファーを作成して頂点シェーダーに適用する例を次に示します: http://msdn.microsoft.com/en-us/library/ff476896.aspx