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

Descriptor tables

Descriptor Tables (таблицы дескрипторов) – это механизм управления ресурсами в Direct3D 12, который позволяет группировать и передавать дескрипторы ресурсов в шейдеры через Root Signature. Они упрощают управление большим количеством ресурсов, таких как текстуры, буферы и UAV (Unordered Access Views), предоставляя более эффективный способ организации доступа к данным на GPU.

Основные характеристики Descriptor Tables

  • Гибкость и масштабируемость – Позволяют передавать сразу несколько ресурсов, уменьшая накладные расходы на установку состояний.
  • Эффективность – Упрощают работу с большим количеством ресурсов, снижая затраты на API-вызовы.
  • Организация доступа к данным – Объединяют несколько дескрипторов в одну структуру, что ускоряет доступ к ресурсам внутри шейдера.

Использование Descriptor Tables в Direct3D 12

В Direct3D 12 дескрипторы управляются с помощью Descriptor Heaps, а Descriptor Tables позволяют группировать их для удобного доступа из шейдеров. Процесс работы с ними включает несколько этапов:

  1. Создание дескрипторного хипа (Descriptor Heap)
D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};
heapDesc.NumDescriptors = 10;
heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&descriptorHeap));
  1. Создание Descriptor Table в Root Signature
D3D12_ROOT_PARAMETER rootParam = {};
rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParam.DescriptorTable.NumDescriptorRanges = 1;
D3D12_DESCRIPTOR_RANGE descriptorRange = {};
descriptorRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
descriptorRange.NumDescriptors = 1;
descriptorRange.BaseShaderRegister = 0;
rootParam.DescriptorTable.pDescriptorRanges = &descriptorRange;
  1. Привязка дескрипторов к командному списку
commandList->SetDescriptorHeaps(1, &descriptorHeap);
commandList->SetGraphicsRootDescriptorTable(0, descriptorHeap->GetGPUDescriptorHandleForHeapStart());

Где применяются Descriptor Tables?

  • Текстурирование – Позволяют передавать в шейдеры сразу несколько текстур без необходимости множества отдельных привязок.
  • Постобработка – Упрощают доступ к нескольким промежуточным буферам для фильтрации изображений и обработки эффектов.
  • Компьютерные шейдеры – Обеспечивают удобный доступ к большим объемам данных при выполнении сложных вычислений на GPU.
  • Рендеринг материалов – Позволяют эффективно управлять ресурсами для рендеринга сложных материалов с множеством текстур и параметров.

Заключение

Descriptor Tables – это мощный механизм управления ресурсами в Direct3D 12, который значительно оптимизирует передачу данных в шейдеры. Они позволяют уменьшить количество API-вызовов, повысить производительность и упростить управление сложными графическими сценами, обеспечивая более эффективное использование аппаратных возможностей GPU.