Ресурсы в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki

Общие сведения

Ресурсы хранят большую часть информации, используемой или формируемой в процессе рендеринга: исходную геометрию, текстуры, шейдеры и т. д. Кроме того, ресурсы могут формироваться в процессе самого рендеринга: технически ресурсом является и результат (цель) рендеринга, и различные промежуточные данные, записываемые в память и затем, возможно, опять поступающие на вход графического конвейера.

Жизненный цикл ресурса включает три этапа:

  • создание ресурса вызовом соответствующего метода интерфейса устройства;

  • привязка ресурса к конвейеру, что в Direct3D10 осуществляется соответствующим методом устройства, а в Direct3D11 — контекста устройства. У каждой стадии конвейера может быть активно до 128 ресурсов включительно.

    Следует учитывать, что в Direct3D10 привязка ресурса не увеличивает счётчик использования интерфейса этого ресурса, поэтому приложение должно сохранять интерфейс до окончания его использования конвейером. В Direct3D11 счётчик увеличивается, поэтому приложение может освобождать интерфейс сразу после привязки, если самому приложению он больше не понадобится;

  • уничтожение ресурса вызовом обычного метода Release.

Типы данных в ресурсах

Ресурсы могут быть полностью типизированным или нетипизированными.

Создание полностью типизированного ресурса ограничивает формат хранящихся в нём данных типом, указанным при создании. Это снижает гибкость использования ресурса, однако повышает его эффективность, особенно в случае, если он создаётся с флагами, указывающими, что он не может отображаться приложением (то есть что он может использоваться только графическим процессором). Подобные ресурсы не могут быть интерпретированы иначе, чем указано при создании.

Создание нетипизированного или, точнее, слаботипизированного ресурса определяет лишь семейство форматов, к которому относятся данные, содержащиеся в ресурсе. Помимо «нетипизированного» типа, например, DXGI_FORMAT_R32G32B32A32_TYPELESS, при создании ресурса определяются объём отводимой под него памяти и необходимость генерации так называемых mipmap-уровней — уменьшенных текстур, применяемых для упрощения и ускорения работы с разными уровнями детализации одной и той же текстуры.

Виды ресурсов

Direct3D10 поддерживает два вида ресурсов — буферы и текстуры, каждый из которых имеет несколько вариаций. Буферы могут привязываться к конвейеру напрямую, текстуры — только через так называемые представления ресурсов (они могут, а в некоторых случаях должны использоваться и для привязки буферов).

В Direct3D11 к ним добавились следующие модификации ресурсов, в первую очередь предназначенные для вычислительных шейдеров:

  • буферы и текстуры, доступные для чтения и записи;
  • структурные буферы (т. е. буферы, доступные в шейдерах как массивы структур);
  • побайтово адресуемые (сырые) буферы;
  • буферы для добавления и потребления данных;
  • буферы и текстуры с неупорядоченным доступом.

Эти модификации опираются на обычные буферы и текстуры, разница заключается в возможностях шейдеров по работе с ними. Например, в шейдерной модели 4, используемой в Direct3D10, ресурсы доступны только для чтения, а шейдерная модель 5, появившаяся вместе с Direct3D11, имеет средства для записи в ресурсы, что автоматически сделало буферы и текстуры доступными не только для чтения, но и для записи.

В Direct3D11.2 появилась поддержка плиточных ресурсов.

В зависимости от возможностей аппаратуры гарантируется лишь определённый максимум характеристик ресурсов. Например, максимальная размерность одномерной текстуры для оборудования уровня DirectX 11 равна 16384, а для уровня DirectX 9.1 — 2048. Эти значения определены в виде констант. Программа может пытаться создать ресурс, выходящий за установленные пределы, — такая попытка будет успешной, если соответствует фактическим возможностям оборудования, которые могут превышать требуемые данной версией DirectX.

Подресурсы

Direct3D может обращаться к ресурсу целиком или к некоторой его части, называемой подресурсом. Буферы являются ресурсами, состоящими из единственного подресурса, однако текстуры могут иметь более сложное устройство.

Простая одномерная текстура является, по сути, одномерным массивом текселей, содержащихся в единственном подресурсе этой текстуры:

Однако текстура может иметь уровни детализации (так называемые mipmap или LOD — level of details), и тогда каждый из уровней будет отдельным подресурсом одного ресурса:

Наконец, текстуры (как обычные, так и с mipmap-уровнями) могут быть объединены в текстурный массив:

Каждый mipmap-уровень каждой текстуры в массиве является отдельным подресурсом.

Методы, работающие с подресурсами, для определения, к какому именно подресурсу должен выполняться доступ, обычно используют описание представления (о представлениях ресурсов будет сказано ниже). Возможны следующие варианты выбора подресурсов:

  • секция массива, то есть весь набор mipmap-уровней одной из текстур массива:

  • mip-секция, то есть набор, включающий один и тот же mipmap-уровень для всех текстур массива:

  • единичный подресурс, то есть конкретный mipmap-уровень конкретной текстуры:

  • комбинация подресурсов:

Представление цели рендеринга может использовать лишь единичные подресурсы или mip-секции, поскольку не может комбинировать текстуры разного размера. Представление шейдерного ресурса может использовать любую прямоугольную область массива текстур.