2016-05-17 133 views
2

我剛開始學習新的DirectX 12 API。我想在dx12之上編寫一種渲染引擎,並且在初始化期間我應該創建描述符堆。問題是,在這個時候,我不知道我將來會創建多少資源視圖。例如如果我想包含某些需要渲染紋理方法的後期處理效果,我必須爲要渲染的紋理創建渲染目標視圖。這些RTV的數量可能會有所不同。那麼,你如何創建足夠大的描述符堆來應對每種情況?DirectX 12 - 描述符堆

有什麼建議嗎?

+0

爲什麼你特別使用DirectX 12?你是否已經是Direct3D 11的專家? –

+0

是的,我正在學習的最後兩年dx11 – Philinator

+0

您何時以及如何管理您的描述符堆在DX 12中是由您定義的。如果您覺得適合編寫您自己的DirectX 11 Runtime版本,那麼DirectX 12適用於你:) –

回答

2

與描述符堆的想法是有一個大的GPU可見的一個,和一堆的CPU可見的。這是因爲SetDescriptorHeaps是一個代價高昂的操作,您不希望將其稱爲一次或兩次以上的幀。

您需要使用大gpu可見堆作爲環形緩衝區,爲您想要準備的當前繪製或調度分配空間,並從您爲其準備的各種cpu可見描述符中進行復制。你可以擁有許多cpu可見的描述符堆,它或多或少只是一個常規分配包裝到d3d對象中。

該副本沒有任何使用壽命保護,並且由CPU立即執行,請注意不要在GPU上使用可能仍在使用的描述符。

我在這裏談論SRV和採樣器。 RTV只有CPU可見,並且您可以隨意創建任意數量的描述符堆,如果您喜歡並且不關心d3d對象開銷,則可以根據需要創建一個描述符堆,每個描述符一個描述符堆,但對運行時沒有任何性能影響。

+0

爲渲染目標視圖創建多個描述符堆時真的沒有開銷嗎? – Philinator

+0

所以,你的意思是我應該爲SRV,無人機和CBV建立一個非常大的描述符堆,併爲每個RTV創建一個新的描述符堆?如果我錯了,請糾正我。 – Philinator

+0

@Philinator RTV/DSV堆只供CPU使用,它們不與GPU交互,它們的編號無關緊要。 SRV/UAV/CBV和採樣器的情況並非如此。在某些硬件上調用「SetDescriptorHeaps」可能代價高昂,應該不惜一切代價避免變更參數。你唯一的解決方案是在小cpu可見的堆中準備描述符,它們的計數並不重要,然後在使用點調用'CopyDescriptors'或'CopyDescriptorsSimple'到大的gpu。但我只是在這裏解釋我的答案:) – galop1n