Strukturtyp

Verwenden Sie die folgende Syntax, um eine Struktur mithilfe von HLSL zu deklarieren.

Strukturname{ [InterpolationModifier] Type[RxC] MemberName; ... };

Parameter

Namen

Eine ASCII-Zeichenfolge, die den Strukturnamen eindeutig identifiziert.

[InterpolationModifier]

Optionaler Modifizierer, der einen Interpolationstyp angibt. Weitere Informationen finden Sie im Abschnitt Hinweise.

Typ[RxC]

Der Membertyp mit einer optionalen Arraygröße für Zeilen (R) x Spalte (C). Eine Struktur enthält mindestens ein Element. wenn es mehr als ein Element enthält, sind die Elemente alle vom gleichen Typ. Die Anzahl der Zeilen und Spalten sind ganze Zahlen ohne Vorzeichen zwischen 1 und 4 einschließlich.

Membername

Eine ASCII-Zeichenfolge, die den Membernamen eindeutig identifiziert.

Bemerkungen

Ein Interpolationsmodifizierer kann für jeden Strukturmember oder für ein Argument für eine Pixel-Shaderfunktion angegeben werden. Wenn an beiden Stellen ein Modifizierer angezeigt wird, überschreibt der externe Modifizierer (der Pixel-Shaderargumentmodifizierer) den inneren Modifizierer (den Strukturmodifizierer).

Beim Kompilieren eines Shaders oder effekts packt der Shadercompiler Strukturmitglieder nach HLSL-Packregeln.

Interpolationsmodifizierer, die in Shadermodell 4 eingeführt wurden

Vertex-Shaderausgaben, die für Pixel-Shadereingaben verwendet werden, werden linear interpoliert, um während der Rasterung Pixelwerte abzurufen. Verwenden Sie zum Festlegen der Interpolationsmethode einen der folgenden Werte, die im Shadermodell 4 oder höher unterstützt werden. Der Modifizierer wird bei jeder Vertex-Shaderausgabe ignoriert, die nicht als Pixel-Shader-Eingabe verwendet wird.

Interpolationsmodifizierer Beschreibung
Lineare Interpolieren zwischen Shadereingaben; linear ist der Standardwert, wenn kein Interpolationsmodifizierer angegeben ist.
Schwerpunkt Interpolieren Sie zwischen Beispielen, die sich irgendwo innerhalb des abgedeckten Bereichs des Pixels befinden (dies erfordert möglicherweise extrapolierende Endpunkte aus einem Pixelzentrum). Die zentrierte Stichprobenentnahme kann das Antialiasing verbessern, wenn ein Pixel teilweise bedeckt ist (auch wenn das Pixelzentrum nicht abgedeckt ist). Der zentrive Modifizierer muss mit dem linearen oder noperspektiven Modifizierer kombiniert werden.
nointerpolation Interpolieren Sie nicht .
noperspective Führen Sie während der Interpolation keine Perspektivkorrektur durch. Der noperspective-Modifizierer kann mit dem Centroid-Modifizierer kombiniert werden.
Beispiel Verfügbar im Shadermodell 4.1 und höher Interpolieren Sie am Beispielort und nicht im Pixelmittelpunkt. Dadurch wird der Pixel-Shader pro Beispiel und nicht pro Pixel ausgeführt. Eine andere Möglichkeit, die Ausführung pro Beispiel zu verursachen, besteht darin, eine Eingabe mit semantischem SV_SampleIndex zu erhalten, die das aktuelle Beispiel angibt. Nur die Eingaben mit angegebenen Beispielen (oder eingaben SV_SampleIndex) unterscheiden sich zwischen Shaderaufrufen im Pixel, während andere Eingaben, die keine Modifizierer angeben (z. B. wenn Sie Modifizierer auf verschiedenen Eingaben mischen), weiterhin im Pixelzentrum interpolieren. Sowohl der Pixel-Shaderaufruf als auch der Tiefen-/Schablonentest erfolgen für jedes abgedeckte Beispiel im Pixel. Dies wird manchmal als Supersampling bezeichnet. Im Gegensatz dazu wird der Pixel-Shader einmal pro Pixel aufgerufen, unabhängig davon, wie viele Stichproben abgedeckt werden, während die Tiefen-/Schablonentests bei der Stichprobenhäufigkeit durchgeführt werden. Beide Modi bieten ein entsprechendes Edge-Antialiasing. Supersampling bietet jedoch eine bessere Schattierungsqualität, indem der Pixel-Shader häufiger aufgerufen wird.
1. Bei Verwendung eines int/uint-Typs ist die einzige gültige Option **nointerpolation**.

Interpolationsmodifizierer können auf Strukturmember oder Funktionsargumente oder beides angewendet werden.

Beispiele

Hier finden Sie einige Beispielstrukturdeklarationen.

struct struct1
{
  int    a;
}

Diese Deklaration enthält ein Array.

struct struct2
{
  int    a;
  float  b;
  int4x4 iMatrix;
}

Diese Deklaration enthält einen Interpolationsmodifizierer.

struct In
{
  centroid float2 Texcoord;
};

Siehe auch

Datentypen (DirectX HLSL)