uz
DF
Daniil Fedorov
июля 8, 2025
Обновлено июля 8, 2025

Descriptor Heaps

Descriptor Heaps — это один из ключевых механизмов управления ресурсами в графическом API Direct3D 12. Они представляют собой массивы дескрипторов ресурсов, упрощающие и ускоряющие доступ к данным во время рендеринга.

Основные концепции

В Direct3D 12 дескрипторы используются для представления ресурсов, таких как текстуры, буферы и сэмплеры. Descriptor Heap — это специальная область памяти, содержащая эти дескрипторы, позволяя графическому процессору (GPU) быстро получать доступ к нужным данным.

Типы Descriptor Heaps

В Direct3D 12 предусмотрены четыре типа Descriptor Heap:

  1. CBV/SRV/UAV Heap — используется для хранения дескрипторов:
    • CBV (Constant Buffer View) — представление константных буферов.
    • SRV (Shader Resource View) — представление ресурсов, используемых в шейдерах (например, текстур и структурированных буферов).
    • UAV (Unordered Access View) — представление ресурсов, к которым можно обращаться без соблюдения порядка (например, для вычислений в Compute Shader).
  2. Sampler Heap — содержит дескрипторы сэмплеров, управляющих фильтрацией и адресацией текстур.
  3. RTV Heap (Render Target View) — хранит дескрипторы рендер-таргетов (RTV), которые используются в качестве целевых буферов рендеринга.
  4. 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 и улучшить производительность рендеринга.