Поделиться через


Пример корневых подписей

В следующем разделе показаны корневые сигнатуры с разной сложностью от пустых до полностью полных.

Пустая корневая подпись

Пустая корневая сигнатура не имеет привязок

Пустая корневая сигнатура вряд ли будет полезна, но может использоваться в тривиальной отрисовке с использованием только входного ассемблеров и минимальных вершинных и пиксельных шейдеров, которые не обращаются к дескрипторам. Кроме того, доступны этапы смешивания, целевого объекта отрисовки и трафарета глубины даже с пустой корневой сигнатурой.

Одна константа

константы с одним корнем

Слот привязки 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+.

Уровни оборудования привязки ресурсов

Привязка ресурсов в HLSL

Корневые подписи