packoffset

Optionales Schlüsselwort für das Packen von Shaderkonstanten, das die folgende Syntax verwendet:

: packoffset( c [ Subcomponent ] [ .component ] )

Parameter

Element BESCHREIBUNG
packoffset
Erforderliches Schlüsselwort.
C
Das Packen gilt nur für Konstantenregister (c).
[Unterkomponente ] [ .component]
Optionale Unterkomponenten und Komponenten. Eine Unterkomponente ist eine Registernummer, die eine ganze Zahl ist. Eine Komponente hat die Form [ .xyzw ] .

Bemerkungen

Verwenden Sie dieses Schlüsselwort, um eine Shaderkonstante manuell zu packen, wenn Sie einen Variablentyp deklarieren.

Beim Packen einer Konstante können Sie keine konstanten Typen mischen.

Der Compiler verhält sich für globale Konstanten und einheitliche Konstanten etwas anders:

  • Eine globale Konstante. Eine globale Variable wird einem $Global cbuffer vom Compiler als globale Konstante hinzugefügt. Automatisch gepackte Elemente (elemente, die ohne packoffset deklariert wurden) werden nach der letzten manuell gepackten Variablen angezeigt. Sie können Typen mischen, wenn Sie globale Konstanten packen.
  • Eine einheitliche Konstante. Ein einheitlicher Parameter in der Parameterliste einer Funktion wird einem $Param konstanten Puffer vom Compiler hinzugefügt, wenn der Shader außerhalb des Effektframeworks kompiliert wird. Bei der Kompilierung innerhalb des Effektframeworks muss eine einheitliche Konstante in eine einheitliche Variable aufgelöst werden, die im globalen Gültigkeitsbereich definiert ist. Eine einheitliche Konstante kann nicht manuell versetzt werden. die empfohlene Verwendung ist nur für die Spezialisierung von Shadern, bei denen sie einen Alias zurück an globale Namen setzen, nicht als Mittel zum Übergeben von Anwendungsdaten an den Shader.

Im Folgenden finden Sie einige zusätzliche Beispiele: Komprimieren von Konstanten mithilfe des Shadermodells 4.

Beispiele

Im Folgenden finden Sie einige Beispiele für das manuelle Packen von Shaderkonstanten.

Packen Sie Unterkomponenten von Vektoren und Skalaren, deren Größe groß genug ist, um das Überschreiten von Registergrenzen zu verhindern. Dies sind z. B. alle gültig:

cbuffer MyBuffer
{
    float4 Element1 : packoffset(c0);
    float1 Element2 : packoffset(c1);
    float1 Element3 : packoffset(c1.y);
}

Weitere Informationen

Variablensyntax

Variablen (DirectX HLSL)