Использование дескрипторов непосредственно в корневой сигнатуре
Чтобы избежать необходимости проходить через кучу дескриптора, можно поместить дескриптор непосредственно в корневую сигнатуру. Эти дескрипторы занимают много места в корневой сигнатуре (см. раздел Ограничения корневой подписи), поэтому рекомендуется использовать их с осторожностью.
Примером использования может быть размещение в корневом макете представления буфера констант (CBV), которое изменяется при каждом отрисовке. Таким образом, пространство кучи дескриптора не должно выделяться приложением для каждого отрисовки (и сохраняет указание таблицы дескриптора в новом расположении в куче дескриптора). Помещая что-то в корневую сигнатуру, приложение просто перекладывает ответственность за управление версиями на драйвер; но это инфраструктура, которая уже есть у водителей.
Для отрисовки, которая использует очень мало ресурсов, использование таблицы или кучи дескриптора может вообще не потребоваться, если все необходимые дескрипторы можно поместить непосредственно в корневую сигнатуру.
Это единственные типы дескрипторов, поддерживаемые в корневой сигнатуре.
- Представление буфера констант (CBV).
- Представления ресурсов шейдера или неупорядоченные представления доступа (БПЛА) буферных ресурсов, в которых преобразование формата не требуется (нетипизированные буферы). Некоторые примеры нетипизированных буферов, которые можно связать с корневыми дескрипторами, включают
StructuredBuffer<type>
,RWStructuredBuffer<type>
ByteAddressBuffer
иRWByteAddressBuffer
. Типизированные буферы, такие какBuffer<uint>
иBuffer<float2>
, не могут. - SrV структур ускорения луча в локальных или глобальных корневых сигнатурах.
У UAV в корневом каталоге не могут быть связанные счетчики. Дескрипторы в корневой сигнатуре отображаются как отдельные отдельные дескрипторы. Они не могут быть динамически индексированы.
struct SceneData
{
uint foo;
float bar[2];
int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);
В приведенном выше примере mySceneData
нельзя объявить как массив, как если cbuffer mySceneData[2]
бы он был сопоставлен с дескриптором в корневой сигнатуре. Это связано с тем, что индексирование между дескрипторами не поддерживается в корневой сигнатуре. При необходимости можно определить отдельные буферы констант и определить их как отдельную запись в корневой сигнатуре. Обратите внимание, что внутри mySceneData
выше имеется массив bar[2]
. Динамическое индексирование в буфере констант является допустимым. Дескриптор в корневой сигнатуре ведет себя так же, как и тот же дескриптор при доступе к нему через кучу дескриптора. Это отличается от встраиваемых констант непосредственно в корневую сигнатуру, которая также отображается как буфер констант, за исключением ограничения, что динамическое индексирование во встраиваемых констант запрещено, поэтому bar[2]
там не допускается.
Эти API (из интерфейса ID3D12GraphicsCommandList ) предназначены для установки дескрипторов непосредственно в корневой сигнатуре.
- SetComputeRootConstantBufferView
- SetGraphicsRootConstantBufferView
- SetComputeRootShaderResourceView
- SetGraphicsRootShaderResourceView
- SetComputeRootUnorderedAccessView
- SetGraphicsRootUnorderedAccessView
Примечание
В Direct3D 12 отсутствует концепция корневого массива дескрипторов . Массивы дескрипторов поддерживаются только в кучах дескрипторов.