預設紋理對應
使用預設紋理對應可減少複製和記憶體使用量,同時在 GPU 與 CPU 之間共用影像資料。 不過,它應該只在特定情況下使用。 標準撥動版面配置可避免在多個版面配置中複製或撥動資料。
概觀
對應預設紋理不應該是開發人員的第一個選擇。 開發人員應該 (先以離散 GPU 易記的方式撰寫程式碼,也就是沒有大部分紋理的任何 CPU 存取權,並使用 CopySubresourceRegion1 上傳) 。 但是,在某些情況下,CPU 和 GPU 可能會經常在相同的資料上互動,因此對應預設紋理有助於節省電源,或加速特定配接器或架構上的特定設計。 應用程式應該會偵測這些案例,並優化不必要的複本。
在 D3D11.3 中,使用 D3D11_TEXTURE_LAYOUT_UNDEFINED (D3D11_TEXTURE_LAYOUT 列舉) 的一個成員所建立的紋理,而且沒有 CPU 存取是經常 GPU 轉譯和取樣的最有效率。 在效能測試時,應該將這些紋理與 CPU 存取D3D11_TEXTURE_LAYOUT_UNDEFINED進行比較,並使用 CPU 存取D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE,以及交叉配接器支援的D3D11_TEXTURE_LAYOUT_ROW_MAJOR。
搭配 CPU 存取使用D3D11_TEXTURE_LAYOUT_UNDEFINED可讓 WriteToSubresource、 ReadFromSubresource、 Map (排除應用程式對指標) 和 Unmap存取的方法;但可以犧牲 GPU 存取的效率。 搭配 CPU 存取使用D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE可讓 WriteToSubresource、 ReadFromSubresource、 Map (傳回應用程式) 的有效指標,以及 Unmap。 它也可以犧牲 GPU 存取的效率,超過 CPU 存取D3D11_TEXTURE_LAYOUT_UNDEFINED。
一般而言,應用程式應該將大部分紋理建立為僅限 GPU 存取,並使用 D3D11_TEXTURE_LAYOUT_UNDEFINED。
在對應預設紋理功能之前,多維度資料只有一個標準化版面配置:「linear」,也稱為「資料列主要」。 當地圖預設值可用時,應用程式應該避免USAGE_STAGING和USAGE_DYNAMIC紋理。 USAGE_STAGING和USAGE_DYNAMIC紋理會使用線性配置。
D3D11.3 (和 D3D12) 引進標準多維度資料配置。 這可讓多個處理單位在相同的資料上運作,而不需複製資料或在多個版面配置之間撥動資料。 標準化版面配置可透過網路效果提升效率,並允許演算法在假設特定模式時縮短。
不過請注意,此標準wizzle 是硬體功能,而且可能不受所有 GPU 支援。
D3D11.3 API
不同于 D3D12,D3D11.3 預設不支援紋理對應,因此您需要查詢 D3D11_FEATURE_DATA_D3D11_OPTIONS2。 標準 swizzle 也需要透過對 ID3D11Device::CheckFeatureSupport 的呼叫來查詢,並檢查 StandardSwizzle64KBSupported
D3D11_FEATURE_DATA_D3D11_OPTIONS2的欄位。
下列 API 參考紋理對應:
列舉
- D3D11_TEXTURE_LAYOUT :控制預設紋理的模糊模式,並在預設紋理上啟用地圖支援。
- D3D11_FEATURE :參考 D3D11_FEATURE_DATA_D3D11_OPTIONS2。
- D3D11_TILE_COPY_FLAG :包含旗標,可複製線性緩衝區與線性緩衝區之間的模糊磚資源。
結構
- D3D11_TEXTURE2D_DESC1 :描述 2D 紋理。 請注意CD3D11_TEXTURE2D_DESC1協助程式結構。
- D3D11_TEXTURE3D_DESC1 :描述 3D 紋理。 請注意CD3D11_TEXTURE3D_DESC1協助程式結構。
方法
- ID3D11Device3::CreateTexture2D1 :建立 2D 紋理的陣列。
- ID3D11Device3::CreateTexture3D1 :建立單一 3D 紋理。
- ID3D11Device3::WriteToSubresource :將資料複製到使用 Map對應D3D11_USAGE_DEFAULT紋理。
- ID3D11Device3::ReadFromSubresource : 從使用 Map對應之D3D11_USAGE_DEFAULT紋理複製資料。
- ID3D11DeviceCoNtext::Map :取得子資源中所含資料的指標,並拒絕該子資源的 GPU 存取。
- ID3D11DeviceCoNtext::Unmap :使資源的指標失效,並重新啟用 GPU 對該資源的存取。
- ID3D11Texture2D1::GetDesc1 :取得 2D 紋理資源的屬性。
- ID3D11Texture3D1::GetDesc1 :取得 3D 紋理資源的屬性。
相關主題