Использование констант непосредственно в корневой сигнатуре
Приложения могут определять корневые константы в корневой сигнатуре, каждая из которых представляет собой набор 32-разрядных значений. Они представлены в языке High Level Shading Language (HLSL) в виде буфера констант. Обратите внимание, что буферы констант по историческим причинам рассматриваются как наборы 4x32-разрядных значений.
Каждый набор констант пользователей рассматривается как скалярный массив из 32 -bit значений, динамически индексируемый и доступный только для чтения из шейдера. Индексирование за пределами допустимых границ заданного набора корневых констант ведет к неопределенным результатам. В HLSL определения структуры данных можно указать для констант пользователей, чтобы дать им типы. Например, если корневая сигнатура определяет набор 4 корневых констант, HLSL может наложить на них следующую структуру.
struct DrawConstants
{
uint foo;
float2 bar;
int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);
Массивы не допускаются в буферах констант, которые сопоставляются с корневыми константами, так как динамическое индексирование в корневом пространстве подписи не поддерживается. Например, недопустимо иметь запись в буфере констант, например float myArray[2];
. Буфер констант, сопоставленный с корневыми константами, не может быть массивом; Поэтому недопустимо сопоставлять cbuffer myCBArray[2]
с корневыми константами.
Константы могут быть частично заданы. Например, если корневая сигнатура определяет четыре 32-разрядных значения в RootTableBindSlot 2, то любое подмножество четырех констант можно задать одновременно (остальные остаются неизменными). Это может быть полезно в пакетах, которые наследуют состояние корневой подписи и могут частично его изменить.
При настройке констант следует внимательно следить за макетом буфера констант, ожидаемым шейдером. Возможно, константы дополнительно выровнены по границам vec4
, например. Чтобы проверить ожидаемый макет, проверьте сведения об отражении из шейдера HLSL.
Следующие API (из интерфейса ID3D12GraphicsCommandList) предназначены для настройки констант непосредственно в корневой сигнатуре:
- SetGraphicsRoot32BitConstant
- SetGraphicsRoot32BitConstants
- SetComputeRoot32BitConstant
- SetComputeRoot32BitConstants
Кроме того, обратитесь к структуре D3D12_ROOT_CONSTANTS.
Связанные разделы