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 позволяют группировать их для удобного доступа из шейдеров. Процесс работы с ними включает несколько этапов:
- Создание дескрипторного хипа (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));
- Создание 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;
- Привязка дескрипторов к командному списку
commandList->SetDescriptorHeaps(1, &descriptorHeap);
commandList->SetGraphicsRootDescriptorTable(0, descriptorHeap->GetGPUDescriptorHandleForHeapStart());
Где применяются Descriptor Tables?
- Текстурирование – Позволяют передавать в шейдеры сразу несколько текстур без необходимости множества отдельных привязок.
- Постобработка – Упрощают доступ к нескольким промежуточным буферам для фильтрации изображений и обработки эффектов.
- Компьютерные шейдеры – Обеспечивают удобный доступ к большим объемам данных при выполнении сложных вычислений на GPU.
- Рендеринг материалов – Позволяют эффективно управлять ресурсами для рендеринга сложных материалов с множеством текстур и параметров.
Заключение
Descriptor Tables – это мощный механизм управления ресурсами в Direct3D 12, который значительно оптимизирует передачу данных в шейдеры. Они позволяют уменьшить количество API-вызовов, повысить производительность и упростить управление сложными графическими сценами, обеспечивая более эффективное использование аппаратных возможностей GPU.