Примеры корневых подписей
В следующем разделе показаны корневые сигнатуры, которые зависят от пустого до полного.
- пустой корневой подписи
- Одна константная
- добавление представления буфера корневой константы
- таблицы дескриптора привязки
- более сложные корневой подписи
- представления ресурсов шейдера потоковой передачи
- связанные разделы
Пустая корневая подпись
Пустая корневая подпись вряд ли полезна, но может использоваться в тривиальном проходе отрисовки с использованием только входного сборщика, а также минимальные вершины и шейдеры пикселей, которые не обращаются к дескрипторам. Кроме того, этап смешивания, этапы подготовки целевого объекта и элементов глубины доступны даже с пустой корневой сигнатурой.
Одна константа
Слот привязки 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);
Еще одна функция корневой подписи — это константа с плавающей 4 корневой точкой, которая составляет четыре DWORDS в размере. Следующая команда привязывает только середину двух DWORDS четырех.
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
Более сложная корневая сигнатура
В этом примере показана плотная корневая сигнатура с большинством типов записей. Две таблицы дескриптора (в слотах 3 и 6) включают несвязанные массивы размеров. Бремя здесь находится в приложении, чтобы коснуться только допустимых дескрипторов в куче. Для необвязанных или очень больших массивов требуется поддержка привязки ресурсов уровня 2+ оборудования.
Существует два статических образца (привязанных без необходимости слотов корневой подписи).
В слоте 9 UAV u4 и UAV u5 объявляются в том же смещение таблицы дескриптора. Это использование псевдонима дескриптора, один дескриптор в памяти будет отображаться как u4 и u5 в шейдерах HLSL. В этом случае шейдер должен быть скомпилирован с параметром D3D10_SHADER_RESOURCES_MAY_ALIAS или параметром /res_may_alias
в FXC. Псевдонимные дескрипторы позволяют привязывать один дескриптор к нескольким точкам привязки, не изменяя шейдеры.
Представления ресурсов шейдера потоковой передачи
Эта корневая сигнатура иллюстрирует сценарий, в котором все группы SRV передаются в один большой массив и из него. Во время выполнения таблица дескриптора может быть задана один раз при установке корневой сигнатуры. Затем все операции чтения текстур выполняются путем индексирования в массив через константы, предоставляемые с помощью первых нескольких корневых аргументов. Требуется только одна куча дескрипторов и обновляется только после потоковой передачи текстур в слоты дескриптора или из них.
Смещения дескриптора в большой куче определяются шейдерами с помощью констант в представлениях буфера констант. Например, если шейдер получает идентификатор материала, он может индексировать один большой массив с помощью константы для доступа к требуемому дескриптору (который ссылается на требуемую текстуру).
Для этого сценария требуется оборудование с уровнем привязки ресурсов уровня 2+.
Связанные разделы
-
привязка ресурсов в HLSL