Использование констант непосредственно в корневой подписи
Приложения могут определять корневые константы в корневой сигнатуре, каждая из которых представляет собой набор 32-разрядных значений. Они отображаются в высокоуровневом языке заливки (HLSL) в виде буфера констант. Обратите внимание, что буферы констант по историческим причинам рассматриваются как наборы 4x32-разрядных значений.
Каждый набор пользовательских констант рассматривается как скалярный массив из 32-разрядных значений, динамически индексируемых и доступных только для чтения из шейдера. Индексирование за пределы заданного набора корневых констант приводит к неопределенным результатам. В 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 .
Связанные темы