默认纹理映射
使用默认纹理映射可以减少在 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、 映射 (阻止应用程序访问指针) 和 Unmap;但可以牺牲 GPU 访问的效率。 将D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE与 CPU 访问配合使用可启用 WriteToSubresource、 ReadFromSubresource、 Map (,该映射返回指向应用程序) 和 Unmap 的有效指针。 它还可以通过 CPU 访问来牺牲 GPU 访问的效率超过 D3D11_TEXTURE_LAYOUT_UNDEFINED。
通常,应用程序应创建大多数纹理作为仅 GPU 可访问且具有D3D11_TEXTURE_LAYOUT_UNDEFINED。
在映射默认纹理特征之前,多维数据只有一个标准化布局:“线性”,也称为“行主”。 当地图默认值可用时,应用程序应避免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 并检查StandardSwizzle64KBSupported
D3D11_FEATURE_DATA_D3D11_OPTIONS2字段来查询标准重排。
以下 API 引用纹理映射:
枚举
- D3D11_TEXTURE_LAYOUT :控制默认纹理的重排模式,并在默认纹理上启用地图支持。
- D3D11_FEATURE :引用 D3D11_FEATURE_DATA_D3D11_OPTIONS2。
- D3D11_TILE_COPY_FLAG :包含用于将重排平铺资源复制到线性缓冲区和从线性缓冲区复制的标志。
结构
- D3D11_TEXTURE2D_DESC1 :描述二维纹理。 请注意CD3D11_TEXTURE2D_DESC1帮助程序结构。
- D3D11_TEXTURE3D_DESC1 :描述三维纹理。 记下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 纹理资源的属性。
相关主题