dx12バインディングビデオを見て、いくつかのドキュメントを読んだ後、ヒープを正しく管理する方法を正しく理解しているかどうかは100%わかりません。DX12ディスクリプタヒープ管理
私のアプリケーションでは達成できないことを説明しましょう: 初期化中、2つのヒープ、1つはサンプラー、もう1つはSRV、CBV、およびUAVを保持します。 これらのヒープには、アプリケーションの有効期間中に使用されるすべてのリソースが含まれます。
ここで興味深い部分が始まります。ルート・シグネチャを構築するには、大部分のルート・ディスクリプタ・テーブルを使用します。
私たちが知っているように、テーブルは範囲を保持します。範囲は基本シェーダスロット、ディスクリプタ数、その他の設定です。 (たとえば、B0、B1、B2用およびB3)非シーケンシャルですが、コマンドリストの記録時に、私たちができるだけの範囲があることができ、例に示すように
Root Parameters
0 - root_table
1 - root_table
0 root_table
CBV b1
CBV b6
SRV t0
SRV t2
1 root_table
Sampler s1
Sampler s4
: 私はあなたとの例をお見せしましょう実行します。我々は適切mCbvSrvUavHeapとmSamplerHeapで注文した記述子を持っている必要がありますことを意味し
ID3D12DescriptorHeaps* heaps[2] = {mCbvSrvUavHeap,mSamplerHeap};
mCmdList->SetDescriptorHeaps(2,heaps);
mCmdList->SetGraphicsRootDescriptorTable(0, mCbvSrvUavHeapGpuHanleStart);
mCmdList->SetGraphicsRootDescriptorTable(1, mSamplerHandleHanleStart);
。例えば
:問題は私のためにあるのはここ
mCbvSrvUavHeap
CBV
CBV
SRV
SRV
です。私が最初に言ったように、私はアプリケーションのすべてのリソースを持つ2つの大きなヒープを作成しますが、使用されない他の記述子を持つので、これらのヒープをコマンドリストに設定することはできません!
どうすれば対応できますか?私は使用する記述子だけを含む新しいヒープを作成する必要がありますか?
私はそれをうまく説明しました!
追加のルートスロットを使用する場合は、連続している必要はありません。 [ここにある](https://github.com/Microsoft/DirectXTK12/blob/master/Src/Shaders/RootSig.fxh)私が[DirectX 12用のDirectX Tool Kit](https://github.com/)で使ったルーツMicrosoft/DirectXTK12)。私は彼らが最適だと言っているわけではないが、彼らは仕事を終わらせる。 –