Descriptor Heaps
Descriptor Heaps — это один из ключевых механизмов управления ресурсами в графическом API Direct3D 12. Они представляют собой массивы дескрипторов ресурсов, упрощающие и ускоряющие доступ к данным во время рендеринга.
Основные концепции
В Direct3D 12 дескрипторы используются для представления ресурсов, таких как текстуры, буферы и сэмплеры. Descriptor Heap — это специальная область памяти, содержащая эти дескрипторы, позволяя графическому процессору (GPU) быстро получать доступ к нужным данным.
Типы Descriptor Heaps
В Direct3D 12 предусмотрены четыре типа Descriptor Heap:
- CBV/SRV/UAV Heap — используется для хранения дескрипторов:
- CBV (Constant Buffer View) — представление константных буферов.
- SRV (Shader Resource View) — представление ресурсов, используемых в шейдерах (например, текстур и структурированных буферов).
- UAV (Unordered Access View) — представление ресурсов, к которым можно обращаться без соблюдения порядка (например, для вычислений в Compute Shader).
- Sampler Heap — содержит дескрипторы сэмплеров, управляющих фильтрацией и адресацией текстур.
- RTV Heap (Render Target View) — хранит дескрипторы рендер-таргетов (RTV), которые используются в качестве целевых буферов рендеринга.
- DSV Heap (Depth Stencil View) — хранит дескрипторы глубины и трафаретных буферов (DSV), обеспечивающих тестирование глубины и трафаретные операции.
Создание и использование Descriptor Heaps
Для создания Descriptor Heap используется структура D3D12_DESCRIPTOR_HEAP_DESC, в которой задаются:
- Тип heap-а (Type — CBV_SRV_UAV, SAMPLER, RTV, DSV).
- Количество дескрипторов (NumDescriptors).
- Флаги (Flags — например, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, если heap должен быть доступен в шейдерах).
- Уровень ноды (NodeMask) для мультиадаптерных систем.
Пример создания descriptor heap для RTV:
D3D12_DESCRIPTOR_HEAP_DESC renderTargetHeapDesc = {};
renderTargetHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
renderTargetHeapDesc.NumDescriptors = 1;
renderTargetHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
device->CreateDescriptorHeap(&renderTargetHeapDesc, IID_PPV_ARGS(&rtvHeap));
Управление дескрипторами
После создания Descriptor Heap необходимо выделять дескрипторы для ресурсов. Это можно сделать с помощью device->Create…View, например:
device->CreateRenderTargetView(renderTarget, nullptr, rtvHeap->GetCPUDescriptorHandleForHeapStart());
Здесь GetCPUDescriptorHandleForHeapStart()возвращает D3D12_CPU_DESCRIPTOR_HANDLE, указывающий на начало heap-а.
Если heap используется в шейдерах, необходимо устанавливать его через SetDescriptorHeaps и связывать таблицы дескрипторов с SetGraphicsRootDescriptorTable или SetComputeRootDescriptorTable.
Заключение
Descriptor Heaps играют важную роль в управлении ресурсами в Direct3D 12, предоставляя гибкий и производительный механизм доступа к данным. Оптимальное использование Descriptor Heaps позволяет значительно повысить эффективность работы GPU и улучшить производительность рендеринга.