私は現在DirectX12用の独自のグラフィックスフレームワークを作成しています(私はすでにパーソナルゲームエンジン向けにいくつかのDirectX 11フレームワークを作成しています)、私は現在リソースバインディングのためにtrying to copy the methods used in the recent Hitman gameです。DirectX 12ディスクリプタヒープを更新する
SRV/CBV/UAVヒープのオブジェクトごとのリソースバインディングを処理する最善の方法については混乱しています。私はいくつかのGDCプレゼンテーションを見てきました。
一度に1つのSRV/CBV/UAVヒープのみをバインドすることができ、コマンドリストの途中で現在バインドされているヒープを切り替えることは、フラッシュを強制することによって一部のハードウェアでパフォーマンスが低下することがあります。このため、新しいディスクリプタでヒープの更新を処理する最善の方法は何ですか?私には、各コマンドリストは次のようになります:
- SRV/CBV/UAVヒープ自体を保持します。
- オブジェクトのサブセット内のオブジェクトごとに、個別のアップロードヒープに配置されたオブジェクトごとのデータを指す記述子をヒープ上に作成します。
- この後、別のコマンドリストは、この埋め込まれた記述子ヒープを取り込み、バインドします。次に、現在の記述子ヒープを移動するために、描画呼び出しを
SetGraphicsRootDescriptorTable
と混ぜて発行します。
これは言われている、いくつかの供給源オンライン(including another SO post)はCPU可視ヒープを使用して、そこに一つの大きなSRV/CBV/UAVヒープコピーを使用して示唆しています。私は彼らが非同期CopyDescriptors
を使用しようとしていないと仮定していますが、むしろCopyBufferRegion
です。私はCopyBufferRegion
を使用してオブジェクトごとのデータを更新しようとしましたが、私にはこれは多くの遷移がD3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER
とD3D12_RESOURCE_STATE_COPY_DEST
の間で不足しているようです。私は何かを誤解していますか?どんな透明性も認められるでしょう。
[MiniEngine](https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine)と[DirectX 12用DirectXツールキット](https:///github.com/Microsoft/DirectXTK12)を参照してください。 –