2017-10-09 69 views
0

我有關DirectX 11DirectX11的 - 紋理和動態變化

幾個問題當我通過CreateTexture2D創建的紋理和我指定默認的使用,我應該能夠使用UpdateSubresource,對不對?

a)內存更新是否必須與原始紋理格式相同?我的意思是當我使用DDS DXT1創建紋理時,UpdateSubresource數據是否也必須是DDS DXT1?

b)什麼時候可以更新資源?在DX12中,您可以在完成命令列表之前更新resoruce。否則沒有任何反應

c)我應該更新每個mip的更新,其中每個子資源的索引是index * miplevels,對嗎?

或者我應該用map unmap來代替嗎?成功更新所需的所有規則是否有很好的例子?

回答

1

這種加載紋理的最有效方法是在創建時使用initData。你可以製作它DEFAULTIMMUTABLE

另一種方法是使用DEFAULT紋理和一組較小的STAGING紋理。您通過Map將數據加載到STAGING紋理中,然後通過CopyResource進行復制。理想情況下,您可以重複使用STAGING紋理(相同大小,mips,格式等)。 UpdateSubresource有效,但效率不高 - 最常用於Constant Buffers。

動態紋理僅用於您計劃更新每幀或每隔幾幀的內容。根據硬件的不同,GPU和CPU可以訪問的內存效率稍低(用於渲染)。

使用在d3d11.h定義的助手D3D11CalcSubresource找出子資源:

UINT D3D11CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT MipLevels) 
{ 
    return MipSlice + ArraySlice * MipLevels; 
} 

這是覆蓋在MSDN上編程指南在:

How to: Initialize a Texture Programmatically
How to: Use dynamic resources

參見DDSTextureLoader and WICTextureLoader

請注意,您可以得到如何低效UpdateSubresource的某種意義上是考慮看看實現該功能here了DirectX 12的幫手。

+0

我真的在做項目的任務,我的目標是用現有的DX11應用程序替換所有紋理。所以我不得不掛鉤不同的DirectX方法。 – Schnappi

0

所以我發現,包括我的解決方案:

如果紋理作爲DYNAMIC創建你不能Map它,如果它擁有一個以上的MIPS。 (我的紋理中有更多的mips,所以我不得不以其他方式去做)

所以我不得不用DEFAULT創建紋理。然後UpdateSubresourceD3D11CalcSubresource在for循環中,我更新了紋理中的所有mips。所以在我的情況下,使用簡單的多紋理貼圖2D紋理:D3D11CalcSubresource(i, 0, totalMipsInTexture)。我設法在調用Present之前更新紋理(注意多線程)。我最後的建議是:如果你掙扎,在DirectX中啓用調試層(當你創建設備傳遞時)。它會告訴你你做錯了什麼。