因此,在觀看dx12綁定視頻並閱讀某些文檔後,如果我正確理解如何管理堆,我不能100%確定。DX12描述符堆管理
讓我解釋一下我在我的應用程序中無法達到的效果: 初始化期間,我將填充兩個堆,一個拿着取樣器,另一個拿着SRV,CBV和UAV。 這些堆將包含應用程序在其生命週期中將使用的所有資源。
現在開始有趣的部分。爲了構建根簽名,我將主要使用根描述符表。我們知道,表格將保存範圍,範圍是基礎着色器槽,描述符的數量和其他設置。 讓我告訴你,例如:
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
如示例所示,還可以有一個是不連續的(例如B0,B1,B2和B3),但是,命令列表錄製過程中,我們只能範圍這樣做:
ID3D12DescriptorHeaps* heaps[2] = {mCbvSrvUavHeap,mSamplerHeap};
mCmdList->SetDescriptorHeaps(2,heaps);
mCmdList->SetGraphicsRootDescriptorTable(0, mCbvSrvUavHeapGpuHanleStart);
mCmdList->SetGraphicsRootDescriptorTable(1, mSamplerHandleHanleStart);
這意味着,我們必須mCbvSrvUavHeap和mSamplerHeap正確下令描述。
例如:
mCbvSrvUavHeap
CBV
CBV
SRV
SRV
這裏是哪裏出了問題對我來說。正如我最初所說,我將爲應用程序創建兩大堆,但是,我不能將這些堆設置到命令列表中,因爲它們將具有其他不會使用的描述符!
我該如何處理?我是否需要創建一個僅包含我將使用的描述符的新Heap?
希望我解釋清楚!
如果您願意使用額外的rootig插槽,則它們不需要連續。 [Here's](https://github.com/Microsoft/DirectXTK12/blob/master/Src/Shaders/RootSig.fxh)我在[DirectX Tool Kit for DirectX 12]中使用的根目錄(https://github.com/)微軟/ DirectXTK12)。我不是說他們是最優的,但他們完成了工作。 –