共用方式為


預設紋理對應

使用預設紋理對應可減少複製和記憶體使用量,同時在 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可讓 WriteToSubresourceReadFromSubresourceMap (排除應用程式對指標) 和 Unmap存取的方法;但可以犧牲 GPU 存取的效率。 搭配 CPU 存取使用D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE可讓 WriteToSubresourceReadFromSubresourceMap (傳回應用程式) 的有效指標,以及 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 的呼叫來查詢,並檢查 StandardSwizzle64KBSupportedD3D11_FEATURE_DATA_D3D11_OPTIONS2的欄位。

下列 API 參考紋理對應:

列舉

結構

方法

Direct3D 11.3 功能