Поделиться через


Ресурсы с плитками томов (Direct3D 12)

Текстуры тома (3D) можно использовать в качестве плиток ресурсов, отметив, что разрешение плиток является трехмерным.

Обзор

Плитки ресурсов отделяют объект ресурса Direct3D от его резервной памяти (ресурсы в прошлом имели связь 1:1 с их резервной памятью). Это позволяет выполнять различные интересные сценарии, такие как потоковая передача данных текстуры и повторное использование или сокращение использования памяти.

Ресурсы с плитками текстуры 2D поддерживаются в Direct3D 11.2. Дополнительная поддержка трехмерных текстур плиток доступна для Direct3D 12 и Direct3D 11.3 (см. D3D12_TILED_RESOURCES_TIER).

Типичные измерения ресурсов, используемые в плитке, — 4 x 4 плитки для трехмерных текстур и 4 x 4 x 4 плитки для трехмерных текстур.

Bits/pixel (1 выборка/пиксель) Размеры плитки (пиксели, w x h x d)
8 64x32x32
16 32x32x32
32 32x32x16
64 32x16x16
128 16x16x16
BC 1,4 128x64x16
BC 2,3,5,6,7 64x64x16

Обратите внимание, что следующие форматы не поддерживаются с плитками: форматы 96bpp, видеоформаты, R1_UNORM, R8G8_B8G8_UNORM, R8R8_G8B8_UNORM.

На приведенных ниже схемах темно-серый представляет плитки NULL.

Сопоставление ресурсов текстуры 3D по умолчанию (наиболее подробное mip)

сопоставление по умолчанию плитки трехмерного ресурса

Сопоставление ресурсов текстуры 3D по умолчанию (второй наиболее подробный MIP)

показан второй наиболее подробный mip

Ресурс текстуры трехмерной плитки (наиболее подробный MIP)

Следующий код настраивает 3D-ресурс с плитками на наиболее подробном MIP.

D3D12_TILED_RESOURCE_COORDINATE trCoord{};
trCoord.X = 1;
trCoord.Y = 0;
trCoord.Z = 0;
trCoord.Subresource = 0;

D3D12_TILE_REGION_SIZE trSize{};
trSize.bUseBox = false;
trSize.NumTiles = 63;

наиболее подробный mip для трехмерной текстуры

Ресурс текстуры трехмерной плитки (второй наиболее подробный MIP)

Следующий код настраивает 3D-ресурс плитки и второй наиболее подробный MIP.

D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 1;
trCoord.Y = 0;
trCoord.Z = 0;
trCoord.Subresource = 1;

D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = false;
trSize.NumTiles = 6;

второй наиболее подробный mip для трехмерной текстуры

Ресурс текстуры трехмерной плитки (одна плитка)

Следующий код настраивает один ресурс плитки.

D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 1;
trCoord.Y = 1;
trCoord.Z = 1;
trCoord.Subresource = 0;

D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = true;
trSize.NumTiles = 27;
trSize.Width = 3;
trSize.Height = 3;
trSize.Depth = 3;

одноуровневый ресурс

Ресурс текстуры трехмерной плитки (единое поле)

Следующий код настраивает универсальный ресурс плитки (обратите внимание на инструкцию trSize.bUseBox = true;) :

D3D12_TILED_RESOURCE_COORDINATE trCoord;
trCoord.X = 0;
trCoord.Y = 1;
trCoord.Z = 0;
trCoord.Subresource = 0;

D3D12_TILE_REGION_SIZE trSize;
trSize.bUseBox = true;
trSize.NumTiles = 27;
trSize.Width = 3;
trSize.Height = 3;
trSize.Depth = 3;

единое поле

API-интерфейсы ресурсов с плитками

Одни и те же вызовы API используются для 2D-ресурсов и 3D-плиток.

Перечисления

  • D3D12_TILED_RESOURCES_TIER: определяет уровень поддержки ресурсов плитки.
  • D3D12_FORMAT_SUPPORT2: используется для проверки поддержки ресурсов на плитках.
  • D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS: определяет поддержку ресурсов плитки в ресурсе с несколькими выборками.
  • D3D12_TILE_COPY_FLAGS: содержит флаги для копирования в ресурсы и из фрагментированных плиток и линейных буферов.

Структуры

  • D3D12_TILED_RESOURCE_COORDINATE: содержит ссылку x, y и z, а также ссылку на подресурс. Обратите внимание, что вспомогательная структура: CD3DX12_TILED_RESOURCE_COORDINATE.
  • D3D12_TILE_REGION_SIZE: указывает размер и количество плиток в области плитки.
  • D3D12_TILE_SHAPE : фигура плитки в виде ширины, высоты и глубины в текселях.
  • D3D12_FEATURE_DATA_D3D12_OPTIONS: содержит поддерживаемый уровень ресурсов плитки и логическое значение, VolumeTiledResourcesSupported, указывает, поддерживаются ли ресурсы плитки тома.

Методика

  • ID3D12Device::CheckFeatureSupport: используется для определения функций и уровня, поддерживаемых текущим оборудованием.
  • ID3D12GraphicsCommandList::CopyTiles: копирует плитки из буфера в ресурс плитки или наоборот.
  • ID3D12CommandQueue::UpdateTileMappings: обновляет сопоставления расположений плиток в плитках с расположениями памяти в куче ресурсов.
  • ID3D12CommandQueue::CopyTileMappings: копирует сопоставления из исходного ресурса плитки в целевой ресурс с плитками.
  • ID3D12Device::GetResourceTiling: получает сведения о том, как фрагментированный ресурс разбивается на плитки.