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


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

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

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

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