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


Использование констант непосредственно в корневой сигнатуре

Приложения могут определять корневые константы в корневой сигнатуре, каждая из которых представляет собой набор 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) предназначены для настройки констант непосредственно в корневой сигнатуре:

Кроме того, обратитесь к структуре D3D12_ROOT_CONSTANTS.

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