Ресурсы - SIISII/DirectX GitHub Wiki

Ресурс (resource) — это, по сути, область памяти, потенциально доступная графическому конвейеру Direct3D. В роли ресурсов выступают геометрическая информация (вершинные и индексные буферы), текстуры, другие данные для шейдеров и т. д. В любой момент времени к каждой стадии конвейера может быть привязано до 128 ресурсов.

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

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

К некоторой стадии конвейера привязывается не сам ресурс напрямую, а так называемое представление ресурса (resource view). Представление задаёт точный формат данных и указывает, какая именно часть ресурса будет использоваться данной стадией. Благодаря представлениям один и тот же ресурс может трактоваться по-разному на различных этапах обработки (хотя имеются определённые ограничения; в первом приближении можно считать, что все типы данных, применяемые к одному ресурсу, должны относиться к одному семейству, например, DXGI_FORMAT_R32G32B32A32_TYPELESS, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_UINT и DXGI_FORMAT_R32G32B32A32_SINT являются совместимыми, а DXGI_FORMAT_R32G32B32A32_FLOAT и DXGI_FORMAT_R32G32B32_FLOAT — нет).

Работа с ресурсами в Direct3D10 и Direct3D11 ведётся принципиально одинаково, однако в Direct3D 12 она сильно отличается.

Поверхности

Поверность в DXGI — это частный случай ресурса, предназначенный для хранения изображения; технически это двухмерная текстура. Чтобы получить поверхность, используемую некоторым видеовыходом, можно воспользоваться методом IDXGIOutput::GetDisplaySurfaceData или IDXGIOutput1::GetDisplaySurfaceData1 (последний доступен, начиная с DirectX 11.1).

При создании подходящего ресурса Direct3D10 или Direct3D11 (т. е. двухмерной текстуры без mipmap-уровней) автоматически создаётся соответствующая ей поверхность, интерфейс которой можно получить через интерфейс ресурса, вызвав обычный метод IUnknown::QueryInterface. В случае Direct3D12 поверхности не создаются.

Для работы с поверхностями DXGI предусмотрены описываемые ниже интерфейсы.

IDXGISurface

Унаследован от интерфейса IDXGIDeviceSubObject. Определён в файле dxgi.h.

IDXGISurface1

Унаследован от интерфейса IDXGISurface. Определён в файле dxgi.h. Поддерживается, начиная с Windows 7 и Windows Vista с SP2.