packoffset
Parola chiave di compressione costante dello shader facoltativa, che usa la sintassi seguente:
: packoffset( c[Subcomponent][.component] )
Parametri
Elemento | Descrizione |
---|---|
packoffset |
Parola chiave obbligatoria. |
C |
La compressione si applica solo ai registri costanti (c). |
[Sottocomponente] [.component] |
Componenti e sottocomponenti facoltativi. Un sottocomponente è un numero di registro, ovvero un numero intero. Un componente è sotto forma di [.xyzw]. |
Commenti
Usare questa parola chiave per comprimere manualmente una costante shader quando si dichiara un tipo di variabile.
Durante la compressione di una costante, non è possibile combinare tipi costanti.
Il compilatore si comporta in modo leggermente diverso per le costanti globali e le costanti uniformi:
- Costante globale. Una variabile globale viene aggiunta come costante globale a un $Global cbuffer dal compilatore. Gli elementi compressi automaticamente (quelli dichiarati senza packoffset) verranno visualizzati dopo l'ultima variabile compressa manualmente. È possibile combinare tipi durante la compressione delle costanti globali.
- Costante uniforme. Un parametro uniforme nell'elenco di parametri di una funzione verrà aggiunto a un $Param buffer costante dal compilatore quando lo shader viene compilato all'esterno del framework degli effetti. Quando viene compilata all'interno del framework degli effetti, una costante uniforme deve essere risolta in una variabile uniforme definita nell'ambito globale. Una costante uniforme non può essere spostata manualmente; il loro uso consigliato è solo per la specializzazione degli shader in cui eseguono l'alias in globals, non come mezzo per passare i dati dell'applicazione nello shader.
Ecco alcuni esempi aggiuntivi: compressione di costanti con il modello shader 4.
Esempio
Ecco alcuni esempi di costanti shader di compressione manuale.
Comprimere sottocomponenti di vettori e scalari le cui dimensioni sono sufficienti per impedire l'attraversamento dei limiti del registro. Ad esempio, questi sono tutti validi:
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}