Uso delle costanti direttamente nella firma di radice
Le applicazioni possono definire costanti radice nella firma radice, ognuna come set di valori a 32 bit. Si presentano in High Level Shading Language (HLSL) come un buffer costante. Si noti che i buffer costanti per motivi cronologici vengono visualizzati come set di valori a 4x32 bit.
Ogni set di costanti utente viene considerato come una matrice scalare di 32 valori -bit, indicizzati in modo dinamico e di sola lettura dallo shader. Indicizzare un insieme di costanti di radice fuori dai limiti produce risultati non definiti. In HLSL è possibile specificare definizioni di struttura dei dati per le costanti utente per assegnare loro tipi. Ad esempio, se la firma radice definisce un set di 4 costanti radice, HLSL può sovrapporre la struttura seguente.
struct DrawConstants
{
uint foo;
float2 bar;
int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);
Le matrici non sono consentite nei buffer costanti che vengono mappate sulle costanti di base perché l'indicizzazione dinamica nello spazio della firma radice non è supportata. Ad esempio, non è valido avere un elemento nel buffer costante come float myArray[2];
. Un buffer costante mappato ai costanti di radice non può essere una matrice; pertanto, non è valido mappare cbuffer myCBArray[2]
nei costanti di radice.
Le costanti possono essere impostate parzialmente. Ad esempio, se la firma radice definisce quattro valori a 32 bit in RootTableBindSlot 2, qualsiasi subset delle quattro costanti può essere impostato alla volta (gli altri rimangono invariati). Ciò può essere utile nei bundle che ereditano lo stato della firma radice e possono modificarlo parzialmente.
Quando si impostano costanti, prestare attenzione al layout costante del buffer previsto dallo shader. È possibile che le costanti vengano riempite fino ai margini vec4
, ad esempio. Per verificare il layout previsto, controllare le informazioni sulla riflessione dello shader HLSL.
Le API seguenti (dall'interfaccia ID3D12GraphicsCommandList) sono destinate all'impostazione di costanti direttamente nella firma radice:
- SetGraphicsRoot32BitConstant
- SetGraphicsRoot32BitConstants
- SetComputeRoot32BitConstant
- SetComputeRoot32BitConstants
Fare riferimento anche alla struttura D3D12_ROOT_CONSTANTS.
Argomenti correlati