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


Подресурс (графика Direct3D 12)

Описывает, как ресурс делится на подресурсы и как ссылаться на один, несколько или срез подресурсов.

Примеры подресурсов

Если ресурс содержит буфер, он просто содержит один подресурс с индексом 0. Если ресурс содержит текстуру (или массив текстур), то ссылка на подресурс является более сложной.

Некоторые API обращаются ко всему ресурсу (например, методу ID3D12GraphicsCommandList::CopyResource ), другим пользователям предоставляется доступ к части ресурса (например, метод ID3D12Resource::ReadFromSubresource ). Методы, обращаюющиеся к части ресурса, обычно используют описание представления (например, структуру D3D12_TEX2D_ARRAY_SRV ) для указания подресурсов для доступа. Полный список см. в разделе API subresource .

Индексирование подресурсов

Чтобы индексировать определенный подресурс, уровни MIP индексируются сначала по мере индексации каждой записи массива.

Индексирование подресурсов

Срез MIP

Срез mip включает один уровень MIP-карты для каждой текстуры в массиве, как показано на следующем рисунке.

Срезы mip в subresource

Срез массива

Учитывая массив текстур, каждая текстура с mIP-картами, срез массива включает одну текстуру и все его уровни MIP, как показано на следующем рисунке.

Срезы массива subresource

Срез плоскости

Как правило, планарные форматы не используются для хранения данных RGBA, но в тех случаях, когда это (возможно, 24bpp RGB-данные), одна плоскость может представлять красное изображение, один зеленый и один синий образ. Хотя один плоскость не обязательно один цвет, два или более цветов могут быть объединены в одну плоскость. Более обычно планарные данные используются для вложенных примеров YCbCr и Depth-Stencil данных. Depth-Stencil — единственный формат, который полностью поддерживает MIP-карты, массивы и несколько плоскостей (часто плоскость 0 для глубины и плоскости 1 для набора элементов).

Индексирование подресурсов для массива двух Depth-Stencil изображений, каждый из которых имеет три уровня MIP, показан ниже.

Индексирование элементов глубины

Вложенный пример YCbCr поддерживает массивы и имеет плоскости, но не поддерживает MIP-карты. Изображения YCbCr имеют два плоскости, один для света (Y), что человеческий глаз наиболее чувствительный к, и один для хрома (как Cb, так и Cr, чередуется), к которому человеческий глаз менее чувствительны к. Этот формат позволяет сжимать значения хрома, чтобы сжать изображение, не влияя на свет, и является общим форматом сжатия видео по этой причине, хотя он используется для сжатия по-прежнему изображений. На рисунке ниже показан формат NV12, отметив, что хроминация сжимается до одной четверти разрешения светимости, что означает, что ширина каждого плоскости идентична, а плоскость хрома — половина высоты плоскости света. Плоскости будут индексированы в виде подресурсов точно так же, как и в приведенном выше примере Depth-Stencil.

формат nv12

Форматы planar существуют в 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-интерфейсы subresource

Ссылки на следующие API и работа с подресурсами:

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

Следующие структуры содержат индексы PlaneSlice , большинство из них содержат индексы MipSlice .

Следующие структуры содержат индексы ArraySlice , большинство из них содержат индексы MipSlice .

Следующие структуры содержат индексы MipSlice , но не индексы ArraySlice или PlaneSlice .

Следующие структуры также ссылались на подресурсы:

Методы:

Текстуры должны находиться в состоянии D3D12_RESOURCE_STATE_COMMON для доступа к ЦП через WriteToSubresource и ReadFromSubresource , чтобы быть законным; но буферы не делают. Доступ к ресурсу ЦП обычно выполняется с помощью карты/Unmap.

Привязка ресурсов