Semantik

Eine Semantik ist eine Zeichenfolge, die an eine Shadereingabe oder -ausgabe angefügt ist, die Informationen über die beabsichtigte Verwendung eines Parameters vermittelt. Semantik ist für alle Variablen erforderlich, die zwischen Shaderphasen übergeben werden. Die Syntax zum Hinzufügen einer Semantik zu einer Shadervariablen wird hier gezeigt (Variable Syntax (DirectX HLSL).)

Im Allgemeinen sind zwischen Pipelinephasen übergebene Daten vollständig generisch und werden vom System nicht eindeutig interpretiert; Beliebige Semantik, die keine besondere Bedeutung hat, ist zulässig. Parameter (in Direct3D 10 und höher), die diese speziellen Semantik enthalten, werden als Systemwertsemantik bezeichnet.

In Direct3D 9 und Direct3D 10 und höher unterstützte Semantik

Die folgenden Semantiktypen werden sowohl in Direct3D 9 als auch in Direct3D 10 und höher unterstützt.

Vertexshadersemantik

Diese Semantik hat Bedeutung, wenn sie einem Vertex-Shaderparameter zugeordnet ist. Diese Semantik wird sowohl in Direct3D 9 als auch in Direct3D 10 und höher unterstützt.

Eingabe Beschreibung type
BINORMAL[n] Binormal float4
BLENDINDICES[n] Blendindikatoren uint
BLENDWEIGHT[n] Blendgewichte float
COLOR[n] Diffuse und Glanzfarbe float4
NORMAL[n] Normalvektor float4
POSITION[n] Vertexposition im Objektbereich. float4
POSITIONT Transformierte Vertexposition. float4
PSIZE[n] Punktgröße float
TANGENT[n] Tangens float4
TEXCOORD[n] Texturkoordinaten float4
Output Beschreibung type
COLOR[n] Diffuse oder Glanzfarbe float4
FOG Vertexnebel float
POSITION[n] Position eines Vertex im homogenen Raum. Berechnen der Position im Bildschirmbereich durch Dividieren (x,y,z) durch w. Jeder Vertex-Shader muss einen Parameter mit dieser Semantik schreiben. HINWEIS: Diese Semantik ist in Direct3D 9 verfügbar. Verwenden Sie für Direct3D 10 und höher stattdessen SV_Position. float4
PSIZE Punktgröße float
TESSFACTOR[n] Mosaizierungsfaktor float

n ist eine optionale ganze Zahl zwischen 0 und der Anzahl der unterstützten Ressourcen. Beispiel: POSITION0, TEXCOORD1 usw.

Pixelshadersemantik

Diese Semantik hat Bedeutung, wenn sie an einen Pixel-Shader-Eingabeparameter angefügt wird. Diese Semantik wird sowohl in Direct3D 9 als auch in Direct3D 10 und höher unterstützt.

Eingabe Beschreibung type
COLOR[n] Diffuse oder Glanzfarbe. float4
TEXCOORD[n] Texturkoordinaten float4
VFACE Gleitkommaskalar, der einen rückseitigen Grundtyp angibt. Ein negativer Wert steht rückwärts, während ein positiver Wert der Kamera entgegensteht.

Hinweis:
Diese Semantik ist in Direct3D 9 Shader Model 3.0 verfügbar. Verwenden Sie für Direct3D 10 und höher stattdessen SV_IsFrontFace.


float
VPOS Die Pixelposition (x,y) im Bildschirmbereich. Informationen zum Konvertieren eines Direct3D 9-Shaders (der diese Semantik verwendet) in einen Direct3D 10- und höher-Shader finden Sie unter Direct3D 9 VPOS und Direct3D 10 SV_Position) float2
Output Beschreibung type
COLOR[n] Ausgabefarbe float4
DEPTH[n] Ausgabetiefe float

n ist eine optionale ganze Zahl zwischen 0 und der Anzahl der unterstützten Ressourcen. Beispiel: PSIZE0, COLOR1 usw.

Die COLOR-Semantik ist nur im Shaderkompatibilitätsmodus gültig (wenn der Shader mit D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY erstellt wird).

Semantik wird nur für Direct3D 10 und neuer unterstützt.

Die folgenden Semantiktypen wurden für Direct3D 10 neu eingeführt und sind für Direct3D 9 nicht verfügbar.

Systemwertsemantik

Systemwertsemantik ist neu bei Direct3D 10. Alle Systemwerte beginnen mit einem SV_ Präfix, ein gängiges Beispiel ist SV_POSITION, das von der Rasterungsstufe interpretiert wird. Die Systemwerte sind in anderen Teilen der Pipeline gültig. Beispielsweise kann SV_Position als Eingabe für einen Vertex-Shader sowie als Ausgabe angegeben werden. Pixelshader können nur mit der SV_Depth und SV_Target Systemwertsemantik in Parameter schreiben.

Andere Systemwerte (SV_VertexID, SV_InstanceID, SV_IsFrontFace) können nur in den ersten aktiven Shader in der Pipeline eingegeben werden, der den jeweiligen Wert interpretieren kann; danach muss die Shaderfunktion die Werte an nachfolgende Phasen übergeben.

SV_PrimitiveID ist eine Ausnahme von dieser Regel, dass nur der erste aktive Shader in der Pipeline eingegeben wird, der den jeweiligen Wert interpretieren kann; die Hardware kann denselben ID-Wert als Eingabe für das Hull-Shader-Vorschaufenster, das Domain-Shader-Vorschaufenster und danach für das zuerst aktivierte Vorschaufenster bereitstellen: Geometrie-Shader-Vorschaufenster oder Pixel-Shader-Vorschaufenster.

Wenn die Mosaizierung aktiviert ist, sind das Hull-Shader-Vorschaufenster und das Domäne-Standard-Vorschaufenster vorhanden. Für einen bestimmten Patch gilt die gleiche PrimitiveID für den Hull-Shaderaufruf des Patches und alle mosaizierte Domäne-Standard Shaderaufrufe. Die gleiche PrimitiveID verteilt sich auch auf das nächste aktive Vorschaufenster; Geometrie-Shader-Vorschaufenster oder Pixel-Shader-Vorschaufenster, wenn diese aktiviert sind.

Wenn der Geometrie-Shader SV_PrimitiveID eingibt und da er null oder mehrere Grundtypen pro Aufruf ausgeben kann, muss der Shader eine eigene Auswahl des SV_PrimitiveID Werts für jeden Ausgabegrundtyp programmieren, wenn ein nachfolgender Pixelshader SV_PrimtiveID eingibt.

Ein weiteres Beispiel ist, dass SV_PrimitiveID nicht von dem Vertex-Shader-Vorschaufenster interpretiert werden können, da ein Vertex Mitglied mehrerer Grundtypen sein kann.

Diese Semantik wurden Direct3D 10 hinzugefügt; sie sind in Direct3D 9 nicht verfügbar.

Systemwertsemantik für die Rasterungsvorschaufenster

Systemwertsemantik Beschreibung type
SV_ClipDistance[n] Clip distance data. SV_ClipDistance Werte werden jeweils als float32 signierter Abstand zu einer Ebene angenommen. Grundtypeinrichtung ruft nur Rasterung auf Pixeln auf, für die die interpolierten Ebenenabstände >= 0 sind. Mehrere Clipebenen können gleichzeitig implementiert werden, indem mehrere Komponenten eines oder mehrerer Vertexelemente als SV_ClipDistance deklariert werden. Die kombinierten Clip- und Cull-Abstandswerte sind bei den meisten D3D#_CLIP_OR_CULL_DISTANCE_COUNT-Komponenten in den meisten D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT Registern enthalten. Verfügbar für alle Shader, in die gelesen oder geschrieben werden soll, mit Ausnahme des Vertex-Shaders, der den Wert schreiben kann, aber nicht als Eingabe.
Das Clipplanes-Attribut funktioniert wie SV_ClipDistance, funktioniert aber auf allen Hardwarefeatureebenen 9_x und höher. Weitere Informationen finden Sie unter Benutzerclipebenen auf Hardware der Featureebene 9.
float
SV_CullDistance[n] Längenabstandsdaten. Wenn Komponenten von Vertexelement(n) diese Bezeichnung erhalten, werden diese Werte jeweils als float32-signierter Abstand zu einer Ebene angenommen. Grundtypen werden vollständig verworfen, wenn der Ebenenabstand für alle Scheitelpunkte des Grundtyps < 0 sind. Mehrere Cull-Ebenen können gleichzeitig verwendet werden, indem mehrere Komponenten eines oder mehrerer Vertexelemente als SV_CullDistance deklariert werden. Die kombinierten Clip- und Cull-Abstandswerte sind bei den meisten D3D#_CLIP_OR_CULL_DISTANCE_COUNT-Komponenten in den meisten D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT Registern enthalten. Verfügbar für alle Shader, in die gelesen oder geschrieben werden soll, mit Ausnahme des Vertex-Shaders, der den Wert schreiben kann, aber nicht als Eingabe.
float
SV_Coverage Eine Maske, die für Eingabe, Ausgabe oder beides eines Pixelshaders angegeben werden kann.
Für SV_Coverage bei einem Pixelshader wird OUTPUT für ps_4_1 oder höher unterstützt.
Für SV_Coverage bei einem Pixelshader wird INPUT ps_5_0 oder höher erfordert.
uint
SV_Depth Tiefenpuffer-Daten Kann vom Pixelshader geschrieben werden. float
SV_DepthGreaterEqual In einem Pixelshader ermöglicht die Ausgabetiefe, solange sie größer oder gleich dem Wert ist, der von der Rasterung bestimmt wird. Ermöglicht das Anpassen der Tiefe, ohne frühe Z zu deaktivieren. float
SV_DepthLessEqual In einem Pixelshader ermöglicht die Ausgabetiefe, solange sie geringer oder gleich dem Wert ist, der von der Rasterung bestimmt wird. Ermöglicht das Anpassen der Tiefe, ohne frühe Z zu deaktivieren. float
SV_DispatchThreadID Definiert die globale Bereichsverschiebung des Thread innerhalb des Dispatch-Aufrufs pro Dimension der Gruppe. Verfügbar als Eingabe für den Compute-Shader. (Nur schreibgeschützt) uint3
SV_DomainLocation Definiert die Position auf dem Hull des aktuellen Domänepunkts, der ausgewertet wird. Verfügbar als Eingabe für den Domäne-Shader. (Nur schreibgeschützt) float2|3
SV_GroupID Definiert die Gruppen-Bereichsverschiebung innerhalb des Dispatch-Aufrufs pro Dimension des Dispatch-Aufrufs. Verfügbar als Eingabe für den Compute-Shader. (Nur schreibgeschützt) uint3
SV_GroupIndex Bietet einen vereinfachten Index für einen bestimmten Thread innerhalb einer bestimmten Gruppe. Verfügbar als Eingabe für den Compute-Shader. (Nur schreibgeschützt) uint
SV_GroupThreadID Definiert die Bereichsverschiebung des Thread innerhalb der Gruppe pro Dimension der Gruppe. Verfügbar als Eingabe für den Compute-Shader. (Nur schreibgeschützt) uint3
SV_GSInstanceID Definiert die Instanz des Geometrie-Shaders. Verfügbar als Eingabe für den Geometrie-Shader. Die Instanz wird benötigt, da ein Geometrie-Shader bis zu 32 Mal für denselben Geometriegrundtyp aufgerufen werden kann. uint
SV_InnerCoverage Stellt unterschätzte konservative Rasterungsinformationen dar (d. h. ob ein Pixel garantiert abgedeckt ist). Kann vom Pixelshader gelesen oder geschrieben werden.
SV_InsideTessFactor Definiert den Betrag der Mosaizierung innerhalb einer Patchoberfläche. Verfügbar im Hull-Shader zum Schreiben und verfügbar im Domäne-Shader zum Lesen. float|float[2]
SV_InstanceID Der Bezeichner pro Instanz wird automatisch von der Laufzeit generiert (siehe Verwenden systemgenerierter Werte (Direct3D 10)). Verfügbar für alle Shader.
SV_IsFrontFace Gibt an, ob ein Dreieck nach vorne gerichtet ist. Für Linien und Punkte weist IsFrontFace den Wert true auf. Die Ausnahme sind Linien, die aus Dreiecken (Drahtmodellmodus) gezeichnet werden, wodurch IsFrontFace auf die gleiche Weise wie die Rasterung des Dreiecks im Volltonmodus festgelegt wird. Kann vom Geometrie-Shader geschrieben und vom Pixelshader gelesen werden. bool
SV_OutputControlPointID Definiert den Index der Kontrollpunkt-ID, die von einem Aufruf des Standard Einstiegspunkts des Hull-Shaders betrieben wird. Kann nur vom Hull-Shader gelesen werden. uint
SV_Position Wenn SV_Position für die Eingabe in einen Shader deklariert wird, kann eins von zwei Interpolationsmodi angegeben werden: linearNoPerspective oder linearNoPerspectiveCentroid, wobei letztere dazu führt, dass centroid-snapped xyzw-Werte beim Multisample-Antialiasing bereitgestellt werden. Bei Verwendung in einem Shader beschreibt SV_Position die Pixelposition. Verfügbar in allen Shadern, um die Pixelmitte mit einer Bereichsverschiebung von 0,5 zu erhalten. float4
SV_PrimitiveID Der Bezeichner pro Grundtyp wird automatisch von der Laufzeit generiert (siehe Verwenden systemgenerierter Werte (Direct3D 10)). Kann von den Geometrie- oder Pixel-Shadern geschrieben und von Geometrie, Pixel, Hull oder Domäne-Shadern gelesen werden. uint
SV_RenderTargetArrayIndex Renderziel-Matrixindex. Wird auf die Geometrie-Shaderausgabe angewendet und gibt das Renderzielmatrix-Segment an, auf das der Grundtyp vom Pixelshader gezeichnet wird. SV_RenderTargetArrayIndex ist nur gültig, wenn das Renderziel eine Matrixressource ist. Diese Semantik gilt nur für Grundtypen; wenn ein Grundtyp mehrere Scheitelpunkte aufweist, wird der Wert aus dem führenden Scheitelpunkt verwendet. Dieser Wert gibt auch an, welches Arraysegment einer Tiefen-/Schablonenansicht für Lese-/Schreibzwecke verwendet wird.
Kann aus dem Geometrie-Shader geschrieben und vom Pixelshader gelesen werden.
Wenn D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer true ist, wird SV_RenderTargetArrayIndex auf jeden Shader angewendet, der der Rasterung zufüttert.
uint
SV_SampleIndex Beispielfrequenz-Indexdaten. Kann nur vom Pixelshader gelesen oder geschrieben werden. uint
SV_StencilRef Stellt den aktuellen Pixelshader-Schablonenreferenzwert dar. Kann nur vom Pixelshader geschrieben werden. uint
SV_Target[n], wobei 0 <= n <= 7 Der Ausgabewert, der in einem Renderziel gespeichert wird. Der Index gibt an, in welche der 8 möglicherweise gebundenen Renderziele geschrieben werden soll. Der Wert ist für alle Shader verfügbar. float[2|3|4]
SV_TessFactor Definiert die Mosaizierungsmenge an jedem Rand eines Patches. Verfügbar zum Schreiben im Hull-Shader und Lesen im Domäne-Shader. float[2|3|4]
SV_VertexID Der Bezeichner pro Vertex wird automatisch von der Laufzeit generiert (siehe Verwenden systemgenerierter Werte (Direct3D 10)). Nur als Eingabe für den Vertex-Shader verfügbar. uint
SV_ViewportArrayIndex Anzeigebereich des Matrixindex. Wird auf die Geometrie-Shaderausgabe angewendet und gibt an, welcher Anzeigebereich für den Grundtyp verwendet werden soll, der gerade ausgeschrieben wird. Kann vom Pixelshader gelesen werden. Der Grundtyp wird transformiert und mit dem vom Index angegebenen Anzeigebereich abgeschnitten, bevor er an die Rasterung übergeben wird. Diese Semantik gilt nur für Grundtypen; wenn ein Grundtyp mehrere Scheitelpunkte aufweist, wird der Wert aus dem führenden Scheitelpunkt verwendet.
Wenn D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer true ist, wird SV_ViewportArrayIndex auf jeden Shader angewendet, der der Rasterung zufüttert.
uint
SV_ShadingRate Definiert durch Shading-Rate-Werte die Anzahl der Pixel, die von einem Pixel-Shader-Aufruf für Geräte mit variabler Shading-Rate Stufe 2 oder höher geschrieben werden. Kann aus dem Pixelshader gelesen werden. Kann aus einem Vertex- oder Geometrie-Shader geschrieben werden. uint

Einschränkungen beim Schreiben von SV_Depth:

  • Wenn Multisampling (MultisampleEnable ist WAHR in D3D10_RASTERIZER_DESC) und das Schreiben eines Tiefenwerts (mit einem Pixelshader) verwendet wird, wird der geschriebene einzelne Wert auch im Tiefentest verwendet. Daher geht die Möglichkeit zum Rendern von Grundtypen in höherer Auflösung verloren, wenn Multisampling.
  • Bei der Verwendung der dynamischen Flusssteuerung ist es unmöglich, zur Kompilierungszeit zu bestimmen, ob ein Shader, der SV_Depth in einigen Pfaden schreibt, garantiert SV_Depth in jeder Ausführung schreiben kann. Wenn Sie SV_Depth nicht schreiben, wenn es deklariert ist, führt dies zu einem undefinierten Verhalten (das auch das Verwerfen des Pixels beinhalten kann).
  • Jeder float32-Wert einschließlich +/-INF und NaN kann in SV_Depth geschrieben werden.
  • Das Schreiben von SV_Depth ist immer noch gültig, wenn Sie Dual Source Color Blending durchführen.

Migration von Direct3D 9 zu Direct3D 10 und höher

Die folgenden Probleme sollten beim Migrieren von Code von Direct3D 9 zu Direct3D 10 und höher berücksichtigt werden:

Zuordnung zur Direct3D 9-Semantik

Einige der Semantiken von Direct3D 10 und später entsprechen direkt den Semantiken von Direct3D 9.

Direct3D 10-Semantik Direct3D 9-Äquivalente Semantik
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLOR

[!] Hinweis für Direct3D 9-Entwickler: Für Direct3D 9-Ziele müssen Shadersemantik gültigen Direct3D 9-Semantik zugeordnet werden. Aus Gründen der Abwärtskompatibilität behandelt FXC POSITION0 (und dessen Variantennamen) als SV_Position. FXC behandelt COLOR als SV_TARGET. DXC und neuere Compiler betrachten POSITION[n] und COLOR als benutzerdefinierte Semantik.

Direct3D 9-VPOS- und Direct3D 10-SV_Position

Die D3D10-Semantik SV_Position bietet ähnliche Funktionen wie die Direct3D 9 Shader Model 3 VPOS-Semantik. In Direct3D 9 wird zum Beispiel die folgende Syntax für einen Pixel-Shader verwendet, der Bildschirmkoordinaten verwendet:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS wurde für die Unterstützung von Shader Model 3 hinzugefügt, um Bildschirmkoordinaten anzugeben, da die POSITION-Semantik für Objektkoordinaten gedacht war.

In Direct3D 10 und höher gibt die SV_Position-Semantik (wenn sie im Kontext eines Pixel-Shaders verwendet wird) die Bildschirmkoordinaten an (versetzt um 0,5). Daher würde der Direct3D 9-Shader (ohne Berücksichtigung des 0,5-Offsets) in etwa dem Folgenden entsprechen:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Wenn Sie von Direct3D 9 auf Direct3D 10 und spätere Versionen umsteigen, müssen Sie dies bei der Übersetzung Ihrer Shader berücksichtigen.

Benutzerausschnittebenen in HLSL

Ab Windows 8 können Sie das Clipplanes-Funktionsattribute in einer HLSL-Funktionsdeklaration anstelle von SV_ClipDistance verwenden, um den Shader auf Featureebene 9_x sowie Featureebene 10 und höher zu bearbeiten. Weitere Informationen finden Sie unter Benutzerclipebenen auf Hardware der Featureebene 9.