默认纹理映射

使用默认纹理映射可以减少在 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 访问配合使用,使 WriteToSubresourceReadFromSubresource映射 (阻止应用程序访问指针) 和 Unmap;但可以牺牲 GPU 访问的效率。 将D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE与 CPU 访问配合使用可启用 WriteToSubresourceReadFromSubresourceMap (,该映射返回指向应用程序) 和 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 并检查StandardSwizzle64KBSupportedD3D11_FEATURE_DATA_D3D11_OPTIONS2字段来查询标准重排。

以下 API 引用纹理映射:

枚举

结构

方法

Direct3D 11.3 功能