Freigeben über


packoffset

Optionales Packen von Shaderkonstanten Schlüsselwort (keyword), die die folgende Syntax verwendet:

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

Parameter

Element BESCHREIBUNG
packoffset
Erforderliche Schlüsselwort (keyword).
C
Die Verpackung gilt nur für konstanten Register (c).
[Teilkomponente] [.component]
Optionale Unterkomponenten und Komponenten. Eine Unterkomponente ist eine Registernummer, bei der es sich um eine ganze Zahl handelt. Eine Komponente hat die Form [.xyzw].

Bemerkungen

Verwenden Sie diese Schlüsselwort (keyword), um beim Deklarieren eines Variablentyps manuell eine Shaderkonstante zu packen.

Beim Packen einer Konstante können Sie keine Konstantentypen mischen.

Der Compiler verhält sich bei globalen Konstanten und einheitlichen Konstanten etwas anders:

  • Eine globale Konstante. Eine globale Variable wird vom Compiler als globale Konstante zu einer $Global cbuffer hinzugefügt. Automatisch verpackte Elemente (die ohne Packoffset deklariert werden) werden nach der letzten manuell gepackten Variablen angezeigt. Beim Packen globaler Konstanten können Sie Typen mischen.
  • Eine einheitliche Konstante. Ein einheitlicher Parameter in der Parameterliste einer Funktion wird einem $Param Konstantenpuffer vom Compiler hinzugefügt, wenn der Shader außerhalb des Effektframeworks kompiliert wird. Wenn sie innerhalb des Effektframeworks kompiliert wird, muss eine einheitliche Konstante in eine einheitliche Variable aufgelöst werden, die im globalen Bereich definiert ist. Eine einheitliche Konstante kann nicht manuell versetzt werden. Ihre Verwendung wird nur für die Spezialisierung von Shadern empfohlen, bei denen sie einen Alias an Globale zurückgibt, nicht als Mittel zum Übergeben von Anwendungsdaten an den Shader.

Hier sind einige zusätzliche Beispiele: Packkonstanten mit Shadermodell 4.

Beispiele

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

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

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

Siehe auch

Variablensyntax

Variablen (DirectX HLSL)