2011-06-14 50 views
12

msdn documentation DirectX 11的紋理,利弊解釋說,在DirectX 11有多種方法來填充編程支持DirectX 11質地:編程方式創建的三種不同的方法

(1)創建一個默認的使用質感紋理並使用內存中的數據初始化它

(2)使用動態使用創建紋理,使用DeviceContext Map獲取指向紋理內存的指針,寫入紋理內存,然後使用Unmap指示完成(在這一點上,我猜測它被複制到GPU)

(3)創建與停滯的紋理g的用法,並遵循與動態紋理相同的步驟,但通過調用ID3D11DeviceContext.CopyResource來使用此分段紋理,從而填充(不可變)的默認或動態紋理。

但是這些文檔並沒有解釋每種方法的優缺點,而且我對directx還是比較陌生的,所以對我來說一點都不清楚。

在directx 11中以編程方式創建紋理的每種方法的優缺點是什麼?

附註:我已閱讀,在舉辦紋理的背景下,閱讀從GPU背面沒有緩衝,所以你必須做你自己的雙緩衝。但我不知道這是否準確,以及它是否適用於使用分段紋理進行書寫(甚至實際上是什麼意思)。

第二方面說明: Map方法文檔說它獲取指向子資源中數據的指針,並拒絕GPU訪問該子資源。當GPU想要訪問基礎數據已被Map調用的紋理時,它會做什麼?失速? (我問,因爲這聽起來像我詢問的利弊的一部分)

+0

添加筆記,因爲我學習。顯然你不能用上面的方法(1)編程式地創建多重採樣的默認紋理。 – 2011-06-14 21:10:00

+0

儘管D3D11_MAP_FLAG非常模糊,但它在調用DirectX 11中的映射時顯然會告訴GPU如果需要映射的資源該怎麼做。目前只記錄一個標誌,並且不清楚是否使用0表示停頓。 – 2011-06-14 22:03:29

+2

顯然,D3D11_USAGE_DYNAMIC資源必須具有等於1的miplevels。 – 2011-06-14 22:10:11

回答

17

正確的答案取決於你要使用的紋理。這三個選項是從CPU獲取數據到紋理中的不同方式。如果這是一個rendertarget,你通常不會提供來自CPU的初始數據,所以你可以忽略這些:創建紋理,當你準備好渲染它(也許先清除它)。

因此,假如你確實有在應用程序的內存,你想進入的紋理數據:

如果這只是一個靜態的紋理(我的意思是紋理從遠遠超過它寫入讀取),那麼你需要一個USAGE_DEFAULT或USAGE_IMMUTABLE紋理。與USAGE_DYNAMIC相比,這些通常針對GPU讀取性能進行了優化。如果您在創建紋理時方便使用數據,則選項(1)最簡單,使用最少的中間內存,而在DX11中,可以在渲染線程的單獨線程上完成向GPU傳輸的數據。如果您在創建紋理時沒有數據,請使用UpdateSubresource()或選項(3)來提供數據。

如果它是一個動態紋理,這意味着您經常從CPU提供新內容(基於CPU的視頻播放是規範情況:數據由CPU每幀提供一次,然後每幀由GPU讀取一次),然後你可能想使用USAGE_DYNAMIC和選項(2)。 USAGE_DYNAMIC紋理針對從CPU流向GPU的數據進行了優化,而不僅僅用於GPU讀取。硬件廠商之間的細節(和性能影響)各不相同,但通常您只想使用USAGE_DYNAMIC(如果您真的是將數據從CPU傳輸到GPU),而不僅僅是因爲它是預先加載靜態數據的便捷方式。選項(3)更加專業化,可以用於將初始數據加載到靜態紋理(重用暫存表面以加載許多紋理的數據),也可以用於相對動態使用的流數據。它可以讓您精確控制GPU/CPU同步以及用於傳輸的中間存儲器。通常你會使用一個循環緩衝區,並使用D3D11_MAP_FLAG_DO_NOT_WAIT來檢查每個緩衝區是否仍在使用先前的CopyResource。我認爲這是一個專家選項 - 如果你不小心,可以通過防止CPU和GPU異步運行來傷害性能。

完全披露:我在Nvidia的D3D驅動程序上工作,但這些是我的個人意見。