2014-08-28 178 views
0

我正在創建着色器管理系統而不是使用Effects 11庫。我有一些關於着色器資源管理的問題。DirectX 11着色器資源管理

如果我有一個恆定緩衝區設置爲着色器代碼中的某個寄存器,當我將它設置在設備上時,是否需要將該緩衝區設置爲該寄存器?如果我有多個使用該寄存器的着色器會怎麼樣?

常量緩衝區是否在內存之間保持在內存之間,還是被清除?舉例來說,我有一個不會從最後一次繪製中改變的常量緩衝區,我是否需要再次設置它?

一次一個設置常量緩衝區還是一次設置一個緩衝區會更慢嗎?

在此先感謝。

回答

2

是的,你需要設置該寄存器,把它想象成一個恆定的緩衝槽。

是的,它會一直存在,直到您將其切換爲另一個。

「一次一個設置常量緩衝區還是一次設置一個緩衝區會更慢?」

你是什麼意思的「一次全部」?

無論如何,檢查上cbuffer管理偉大的信息此NVIDIA演示: https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/gdc12/Efficient_Buffer_Management_McDonald.pdf

注意在像素着色和頂點着色器(不同的着色器類型)使用不同的寄存器,即使你使用的是完全相同的「變量」 hlsl代碼。這是爲你處理的,需要注意的是,要將cbuffer更新到寄存器,可以使用d3d函數的像素着色器版本(VSSetConstantBuffer vs PSSetConstantBuffer等)。那當然是所有類型的着色器。

因此,例如,在hlsl代碼中,可以使用2個常量緩衝區使用相同的插槽(寄存器),但是,請記住不要在同一個着色器上使用這兩個緩衝區。或者,您可以使用相同的常量兩個着色器上的緩衝區,只要記住它不是真的一樣。

+0

感謝您的詳細回覆。一次,我的意思是有一個函數VSSetConstantBuffers,它將緩衝區數組作爲參數,並根據啓動輸入時隙順序設置它們。那麼將它們全部設置好,還是多次調用這個函數會更好? – pghazanfari 2014-08-28 02:55:32

+0

一下子一定。這將使與司機的任何溝通立即發生(更不用說1次函數調用了)。它基本上是功能存在的目的。 – Icebone1000 2014-08-28 02:58:43

+0

一些後續問題: 如何使用相同的寄存器處理2個着色器?我是否需要在兩次調用之間設置常量緩衝區?頂點和索引緩衝區怎麼樣? 我要繪製的每個網格是否使用相同的輸入槽,還是應該使用不同的網格?或者輸入插槽是否允許將不同的數據設置到GPU? – pghazanfari 2014-08-28 03:06:18