Пример корневых подписей
В следующем разделе показаны корневые сигнатуры с разной сложностью от пустых до полностью полных.
- Пустая корневая подпись
- Одна константа
- Добавление представления буфера корневой константы
- Таблицы дескрипторов привязки
- Более сложная корневая сигнатура
- Представления ресурсов потоковой передачи шейдера
- Связанные темы
Пустая корневая подпись
Пустая корневая сигнатура вряд ли будет полезна, но может использоваться в тривиальной отрисовке с использованием только входного ассемблеров и минимальных вершинных и пиксельных шейдеров, которые не обращаются к дескрипторам. Кроме того, доступны этапы смешивания, целевого объекта отрисовки и трафарета глубины даже с пустой корневой сигнатурой.
Одна константа
Слот привязки API — это место, где корневой аргумент для этого параметра будет привязан во время записи списка команд. Число слотов привязки API неявно в зависимости от порядка параметров в корневой сигнатуре (первый всегда равен нулю). В слоте привязки HLSL шейдер будет отображаться корневой параметр. Тип ("uint" в приведенном выше примере) неизвестен оборудованию, но является всего лишь комментарием на изображении. Оборудование будет просто видеть один DWORD в качестве содержимого.
Для привязки константы во время записи списка команд используется команда, аналогичная следующей:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
Добавление представления буфера корневой константы
В этом примере показаны две корневые константы и представление буфера корневой константы (CBV), которое стоит два слота DWORD.
Чтобы привязать представление буфера констант, используйте следующую команду. Обратите внимание, что первый параметр (2) — это слот, показанный на изображении. Как правило, массив констант настраивается, а затем предоставляется шейдерам в b0 в виде CBV.
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
Таблицы дескрипторов привязки
В этом примере показано использование двух таблиц дескрипторов; один объявляет таблицу из пяти дескрипторов, которые будут доступны во время выполнения в куче дескриптора CBV_SRV_UAV, а другой — таблицу из двух дескрипторов, которые будут отображаться во время выполнения в куче дескрипторов выборки.
Привязка таблиц дескрипторов при записи списка команд.
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
Еще одной особенностью корневой сигнатуры является корневая константа float4, размером 4 DWORDS. Следующая команда привязывает только два средних DWORDS из четырех.
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
Более сложная корневая сигнатура
В этом примере показана плотная корневая сигнатура с большинством типов записей. Две таблицы дескриптора (в слотах 3 и 6) включают массивы неограниченного размера. В этом случае приложение может касаться только допустимых дескрипторов в куче. Для неограниченных или очень больших массивов требуется поддержка привязки ресурсов аппаратного уровня 2+.
Существует два статических выборки (привязанных без использования слотов корневой сигнатуры).
В слоте 9 U4 и UAV u5 объявляются с одинаковым смещением таблицы дескриптора. Используется дескриптор с псевдонимом. Один дескриптор в памяти будет отображаться как u4 и u5 в шейдерах HLSL. В этом случае шейдер должен быть скомпилирован с параметром D3D10_SHADER_RESOURCES_MAY_ALIAS или параметром или /res_may_alias
в FXC. Дескрипторы с псевдонимами позволяют привязать один дескриптор к нескольким точкам привязки без внесения каких-либо изменений в шейдеры.
Представления ресурсов потоковой передачи шейдера
Эта корневая сигнатура иллюстрирует сценарий, в котором все SRV передаются в один большой массив и из него. Во время выполнения таблицу дескрипторов можно задать один раз, если задана корневая сигнатура. Затем все операции чтения текстур выполняются путем индексирования в массив с помощью констант, подаваемых через первые несколько корневых аргументов. Требуется только одна куча дескрипторов и обновляется только по мере потоковой передачи текстур в свободные слоты дескрипторов или из них.
Смещения дескрипторов в большой куче определяются шейдерами с помощью констант в представлениях буфера констант. Например, если шейдеру присваивается идентификатор материала, он может индексироваться в одном большом массиве с помощью константы для доступа к требуемому дескриптору (который ссылается на требуемую текстуру).
Для этого сценария требуется оборудование с привязкой ресурсов уровня 2+.
Связанные темы