packoffset
Mot clé d’empaquetage de constante de nuanceur facultatif, qui utilise la syntaxe suivante :
: packoffset( c[Subcomponent][.component] )
Paramètres
Élément | Description |
---|---|
packoffset |
Mot clé obligatoire. |
C |
L’emballage s’applique uniquement aux registres de constantes (c). |
[Sous-composant] [.component] |
Sous-composants et composants facultatifs. Un sous-composant est un numéro de registre, qui est un entier. Un composant est sous la forme de [.xyzw]. |
Notes
Utilisez cette mot clé pour empaqueter manuellement une constante de nuanceur lors de la déclaration d’un type de variable.
Lors de l’empaquetage d’une constante, vous ne pouvez pas mélanger les types de constantes.
Le compilateur se comporte légèrement différemment pour les constantes globales et les constantes uniformes :
- Constante globale. Une variable globale est ajoutée en tant que constante globale à un $Global cbuffer par le compilateur. Les éléments empaquetés automatiquement (ceux déclarés sans packoffset) s’affichent après la dernière variable empaquetée manuellement. Vous pouvez mélanger des types lors de l’emballage de constantes globales.
- Constante uniforme. Un paramètre uniforme dans la liste des paramètres d’une fonction est ajouté à une mémoire tampon constante $Param par le compilateur lorsque le nuanceur est compilé en dehors de l’infrastructure d’effets. Lorsqu’elle est compilée à l’intérieur de l’infrastructure d’effet, une constante uniforme doit se résoudre en variable uniforme définie dans l’étendue globale. Une constante uniforme ne peut pas être décalée manuellement ; leur utilisation recommandée est uniquement pour la spécialisation des nuanceurs où ils ont un alias de retour aux globals, et non pas comme un moyen de transmettre des données d’application dans le nuanceur.
Voici quelques exemples supplémentaires : les constantes d’empaquetage à l’aide du modèle de nuanceur 4.
Exemples
Voici plusieurs exemples de constantes de nuanceur d’empaquetage manuel.
Emballez des sous-composants de vecteurs et scalaires dont la taille est suffisamment grande pour éviter de franchir les limites du registre. Par exemple, tous ces éléments sont valides :
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}