Como usar constantes diretamente em uma assinatura raiz

Os aplicativos podem definir constantes raiz na assinatura raiz, cada uma como um conjunto de valores de 32 bits. Eles aparecem na HLSL (Linguagem de Sombreamento de Alto Nível) como um buffer constante. Observe que buffers constantes por motivos históricos são exibidos como conjuntos de valores de 4x32 bits.

Cada conjunto de constantes de usuário é tratado como uma matriz escalar de valores de 32 bits, indexáveis dinamicamente e somente leitura do sombreador. Fora dos limites, a indexação de um determinado conjunto de constantes raiz produz resultados indefinidos. No HLSL, as definições de estrutura de dados podem ser fornecidas para que as constantes do usuário forneçam tipos a eles. Por exemplo, se a assinatura raiz definir um conjunto de 4 constantes raiz, o HLSL poderá sobrepor a estrutura a seguir neles.

struct DrawConstants
{
    uint foo;
    float2 bar;
    int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);

Matrizes não são permitidas em buffers constantes que são mapeados em constantes raiz, pois não há suporte para a indexação dinâmica no espaço de assinatura raiz. Por exemplo, é inválido ter uma entrada no buffer constante como float myArray[2];. Um buffer constante mapeado para constantes raiz não pode ser uma matriz; portanto, é inválido mapear cbuffer myCBArray[2] em constantes raiz.

As constantes podem ser parcialmente definidas. Por exemplo, se a assinatura raiz definir quatro valores de 32 bits em RootTableBindSlot 2, qualquer subconjunto das quatro constantes poderá ser definido por vez (os outros permanecem inalterados). Isso pode ser útil em pacotes que herdam o estado da assinatura raiz e podem alterá-lo parcialmente.

Ao definir constantes, tenha cuidado com o layout de buffer constante esperado pelo sombreador. É possível que as constantes sejam preenchidas aos vec4 limites, por exemplo. Para verificar o layout esperado, marcar as informações de reflexão do sombreador HLSL.

As seguintes APIs (da interface ID3D12GraphicsCommandList ) são para definir constantes diretamente na assinatura raiz:

Além disso, consulte a estrutura D3D12_ROOT_CONSTANTS .

Assinaturas raiz