Вложенные ресурсы (графика Direct3D 12)
Описывается, как ресурс делится на подресурсы и как ссылаться на один, несколько или срез вложенных ресурсов.
Примеры вложенных ресурсов
Если ресурс содержит буфер, то он просто содержит один подресурс с индексом 0. Если ресурс содержит текстуру (или массив текстур), то ссылаться на подресурсы будет сложнее.
Некоторые API обращаются ко всему ресурсу (например, к методу ID3D12GraphicsCommandList::CopyResource ), другие — к части ресурса (например, к методу ID3D12Resource::ReadFromSubresource ). Методы, которые обращаются к части ресурса, обычно используют описание представления (например , структуру D3D12_TEX2D_ARRAY_SRV ), чтобы указать подресурсы для доступа. Полный список см. в разделе API subresource .
Индексирование подресурса
Для индексирования определенного подресурса сначала индексируются уровни MIP по мере индексации каждой записи массива.
Срез MIP
Срез MIP включает один уровень MIP-карты для каждой текстуры в массиве, как показано на следующем рисунке.
Срез массива
Учитывая массив текстур, каждая текстура с MIP-картами, срез массива включает одну текстуру и все ее уровни MIP, как показано на следующем рисунке.
Срез плоскости
Как правило, планарные форматы не используются для хранения данных RGBA, но в тех случаях, когда это данные RGB (возможно, 24bpp), одна плоскость может представлять красное изображение, одна — зеленая, а другая — синяя. Одна плоскость, хотя не обязательно один цвет, два или более цветов могут быть объединены в одну плоскость. Чаще планарные данные используются для вложенной выборки YCbCr и Depth-Stencil данных. Depth-Stencil — это единственный формат, который полностью поддерживает MIP-карты, массивы и несколько плоскостей (часто плоскость 0 для глубины и плоскость 1 для набора элементов).
Ниже показано индексирование подресурса для массива из двух Depth-Stencil изображений с тремя уровнями MIP.
Вложенная выборка YCbCr поддерживает массивы и плоскости, но не поддерживает MIP-карты. Изображения YCbCr имеют две плоскости: одну для яркости (Y), к которой человеческий глаз наиболее чувствителен, и одна для хрома (как Cb, так и Cr, чередующиеся), к которой человеческий глаз менее чувствителен. Этот формат позволяет сжать значения хрома для сжатия изображения, не влияя на яркость, и по этой причине является распространенным форматом сжатия видео, хотя он используется для сжатия неподвижных изображений. На приведенном ниже рисунке показан формат NV12, в соответствии с тем, что хромэнт был сжат до одной четверти разрешения яркости. Это означает, что ширина каждой плоскости идентична, а плоскость хрома в два раза меньше высоты плоскости яркости. Плоскости будут индексироваться как подресурсы таким же образом, как в Depth-Stencil примере выше.
Плоские форматы существовали в Direct3D 11, но отдельные плоскости не могут быть рассмотрены по отдельности, например для операций копирования или сопоставления. Это было изменено в Direct3D 12, чтобы каждая плоскость получила свой собственный идентификатор подресурса. Сравните следующие два метода вычисления идентификатора подресурса.
Direct3D 11
inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
return MipSlice + (ArraySlice * MipLevels);
}
Direct3D 12
inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{
return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize);
}
Большинство оборудования предполагает, что память для плоскости N всегда выделяется сразу после плоскости N-1.
Альтернативой использованию вложенных ресурсов является то, что приложение может выделить совершенно отдельный ресурс для каждой плоскости. В этом случае приложение понимает, что данные являются планарными и использует несколько ресурсов для их представления.
Несколько подресурсов
Представление шейдер-ресурсов может выбрать любую прямоугольную область вложенных ресурсов, используя один из описанных выше срезов и разумное использование полей в структурах представлений (например , D3D12_TEX2D_ARRAY_SRV), как показано на изображении.
Представление целевого объекта отрисовки может использовать только один срез подресурса или MIP и не может включать подресурсы из нескольких срезов MIP. То есть каждая текстура в целевом представлении отрисовки должна иметь одинаковый размер. Представление шейдер-ресурсов может выбрать любую прямоугольную область вложенных ресурсов, как показано на рисунке.
API-интерфейсы подресурса
Следующие API-интерфейсы ссылались на вложенные ресурсы и работали с ним:
Перечисления:
Следующие структуры содержат индексы PlaneSlice , большинство из них — индексы MipSlice .
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Следующие структуры содержат индексы ArraySlice , большинство из них — индексы MipSlice .
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Следующие структуры содержат индексы MipSlice , но ни ArraySlice , ни PlaneSlice .
Следующие структуры также ссылались на подресурсы:
- D3D12_DISCARD_REGION : структура, используемая при подготовке к отмене ресурса.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT добавляет смещение в ресурс к базовому объему.
- D3D12_RESOURCE_TRANSITION_BARRIER : описывает переход подресурсов между различными способами использования (ресурс шейдера, целевой объект отрисовки и т. д.).
- D3D12_SUBRESOURCE_DATA : данные подресурса включают сами данные, а также шаг строки и среза.
- D3D12_SUBRESOURCE_FOOTPRINT : объем включает формат, ширину, высоту, глубину и шаг строки вложенного ресурса.
- D3D12_SUBRESOURCE_INFO : содержит смещение, шаг строки и глубину вложенного ресурса.
- D3D12_SUBRESOURCE_TILING : описывает том подресурса с плиткой (см. раздел Ресурсы тома с плитками).
- D3D12_TEXTURE_COPY_LOCATION : описывает часть текстуры для копирования.
- D3D12_TILED_RESOURCE_COORDINATE : описывает координаты мозаичного ресурса.
Методы:
- ID3D12Device::GetCopyableFootprints : получает сведения о ресурсе, чтобы разрешить создание копии.
- ID3D12Device::GetResourceTiling : получает сведения о том, как ресурс с плиткой разбивается на плитки.
- ID3D12GraphicsCommandList::ResolveSubresource : копирует подресурссерный ресурс с несколькими выборками в подресурс без нескольких выборок.
- ID3D12Resource::Map : возвращает указатель на указанные данные в ресурсе и запрещает GPU доступ к подресурсам.
- ID3D12Resource::ReadFromSubresource : копирует данные из подресурса или прямоугольной области подресурса.
- ID3D12Resource::Unmap : отменяет сопоставление указанного диапазона памяти и делает недействительным указатель на ресурс. Восстанавливает доступ GPU к подресурсы.
- ID3D12Resource::WriteToSubresource : копирует данные в подресурс или прямоугольную область подресурса.
Текстуры должны находиться в состоянии D3D12_RESOURCE_STATE_COMMON , чтобы доступ к ЦП через WriteToSubresource и ReadFromSubresource был законным; но буферы не делают. Доступ ЦП к ресурсу обычно осуществляется с помощью карты/Unmap.
Связанные темы