默認紋理映射
使用預設紋理對應可減少在 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 進行比較。
使用D3D11_TEXTURE_LAYOUT_UNDEFINED搭配CPU存取可啟用以下方法:WriteToSubresource、ReadFromSubresource、Map(排除應用程式對指標的存取),以及Unmap;但可能犧牲GPU存取效率。 使用 D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE 搭配 CPU 存取,可使 WriteToSubresource、ReadFromSubresource、Map(這會返回一個應用程式的有效指標),以及 Unmap。 它在犧牲 GPU 存取效率時,甚至可能比使用 D3D11_TEXTURE_LAYOUT_UNDEFINED 和 CPU 存取時甚鉅。
一般而言,應用程式應該將大部分的紋理建立為僅供 GPU 使用,並使用 D3D11_TEXTURE_LAYOUT_UNDEFINED。
在映射預設紋理功能出現之前,多維數據僅有一種標準化布局:"linear",也稱為「行優先」或「row-major」。 當映射預設值可用時,應用程式應該避免使用USAGE_STAGING和USAGE_DYNAMIC紋理。 USAGE_STAGING 和 USAGE_DYNAMIC 紋理會使用線性版面配置。
D3D11.3 (和 D3D12) 引進標準多維度數據配置。 這樣做是為了讓多個處理單位在相同的資料上運行,而不需要複製資料或在多個格式之間轉換資料。 標準化的版面配置可透過網路效果提升效率,並允許演算法在假設特定模式時進行縮短。
請注意,此標準旋轉是硬體功能,而且可能不受所有 GPU 支援。
D3D11.3 API
不同於 D3D12,D3D11.3 預設不支援紋理對應,因此您必須查詢 D3D11_FEATURE_DATA_D3D11_OPTIONS2。 需要使用呼叫 ID3D11Device::CheckFeatureSupport 來查詢標準 swizzle,並檢查 D3D11_FEATURE_DATA_D3D11_OPTIONS2的 StandardSwizzle64KBSupported
欄位。
下列 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:從被映射的 D3D11_USAGE_DEFAULT 紋理中複製數據,映射是使用 Map完成的。
- ID3D11DeviceContext::Map : 取得子資源中包含的資料的指標,並拒絕 GPU 對該子資源的存取。
- ID3D11DeviceContext::Unmap :使資源的指標失效,並重新啟用 GPU 對該資源的存取。
- ID3D11Texture2D1::GetDesc1 :取得 2D 紋理資源的屬性。
- ID3D11Texture3D1::GetDesc1 :取得 3D 紋理資源的屬性。
相關主題