Semantik

Eine semantische Zeichenfolge 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 Shadervariable wird hier angezeigt (Variable Syntax (DirectX HLSL)).

Im Allgemeinen sind Daten, die zwischen Pipelinephasen übergeben werden, vollständig generische und nicht eindeutig vom System interpretiert; beliebige Semantik ist zulässig, die keine besondere Bedeutung haben. Parameter (in Direct3D 10 und höher), die diese speziellen Semantik enthalten, werden als Systemwert-Semantik bezeichnet.

Semantik unterstützt in Direct3D 9 und Direct3D 10 und höher

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

Vertex-Shader-Semantik

Diese Semantik hat Bedeutung beim Anfügen an einen Vertex-Shaderparameter. 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] Blend-Indizes uint
BLENDWEIGHT[n] Blendgewichte float
COLOR[n] Diffuse und spekuläre Farbe float4
NORMAL[n] Normalvektor float4
POSITION[n] Vertexposition im Objektraum. 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 spekuläre Farbe float4
NEBEL Vertex-Nebel float
POSITION[n] Position eines Vertexs im homogenen Raum. Berechnen Sie die Position im Bildschirmraum, indem Sie (x,y,z) nach w teilen. Jeder Vertex-Shader muss einen Parameter mit dieser Semantik schreiben. float4
PSIZE Punktgröße float
TESSFACTOR[n] Tessellationsfaktor float

n ist eine optionale Ganze Zahl zwischen 0 und der Anzahl der unterstützten Ressourcen. Beispielsweise POSITION0, TEXCOORD1 usw.

Pixel-Shader-Semantik

Diese Semantik hat Bedeutung beim Anfügen an einen Pixel-Shader-Eingabeparameter. Diese Semantik wird sowohl in Direct3D 9 als auch in Direct3D 10 und höher unterstützt.

Eingabe BESCHREIBUNG type
COLOR[n] Diffuse oder spekuläre Farbe. float4
TEXCOORD[n] Texturkoordinaten float4
VFACE Gleitkomma-Skalar, der einen rückseitigen Grundtyp angibt. Ein negativer Wert steht rückwärts, während ein positiver Wert der Kamera gegenübersteht.
[! Hinweis]
Diese Semantik ist in Direct3D 9 ShaderModell 3.0 verfügbar. Verwenden Sie für Direct3D 10 und höher stattdessen SV_IsFrontFace .

float
VPOS Die Pixelposition (x,y) im Bildschirmraum. Informationen zum Konvertieren eines Direct3D 9-Shaders (mit dieser Semantik) 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
TIEFE[n] Ausgabetiefe float

n ist eine optionale Ganze Zahl zwischen 0 und der Anzahl der unterstützten Ressourcen. Beispielsweise PSIZE0, COLOR1 usw.

Die COLOR-Semantik ist nur im Shaderkompatibilitätsmodus gültig (das heißt, 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 neu für Direct3D 10 eingeführt und sind für Direct3D 9 nicht verfügbar.

System-Value Semantik

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

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

SV_PrimitiveID ist eine Ausnahme für diese Regel, nur in den ersten aktiven Shader in der Pipeline einzugeben, der den bestimmten Wert interpretieren kann; Die Hardware kann den gleichen ID-Wert wie eingaben in der Hull-Shader-Stufe, der Domänen-Shaderstufe und danach, welche Stufe die erste aktiviert ist: Geometrie-Shaderstufe oder Pixel-Shaderstufe.

Wenn die Tessellation aktiviert ist, sind die Hull-Shader-Stufe und die Domänen-Shaderstufe vorhanden. Bei einem bestimmten Patch gilt die gleiche PrimitiveID für die Aufrufe des Hull-Shaders des Patchs und alle tessellierten Domänen-Shader-Aufrufe. Die gleiche PrimitiveID verteilt sich auch auf die nächste aktive Stufe; Geometrie-Shaderstufe oder Pixel-Shaderstufe, wenn aktiviert.

Wenn der Geometrie-Shader SV_PrimitiveID eingibt und weil er null oder mehrere Grundtypen pro Aufruf ausgibt, muss der Shader eine eigene Auswahl des SV_PrimitiveID Werts für jeden Ausgabegrundtyp programmieren, wenn ein nachfolgendes Pixel-Shadereingaben SV_PrimtiveID.

Als anderes Beispiel kann SV_PrimitiveID nicht von der Vertex-Shaderphase interpretiert werden, da ein Vertex ein Element mehrerer Grundtypen sein kann.

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

Systemwert semantische Semantik für die Rasterizerstufe.

System-Value Semantik BESCHREIBUNG type
SV_ClipDistance[n] Clip-Abstandsdaten. SV_ClipDistance Werte werden jeweils als float32 signierter Abstand zu einer Ebene angenommen. Grundtypeinrichtung ruft nur Rasterisierung auf Pixeln auf, für die der interpolierte Ebeneabstand = 0 ist >. 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 am meisten D3D#_CLIP_OR_CULL_DISTANCE_COUNT Komponenten in den meisten D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT Registern. Verfügbar für alle Shader, die gelesen oder geschrieben werden sollen, außer dem Vertex-Shader, 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 Featureebene 9 Hardware.
float
SV_CullDistance[n] Cull-Abstandsdaten. Wenn Komponenten des Vertexelements(n) diese Bezeichnung erhalten, werden diese Werte jeweils als float32 signierter Abstand zu einer Ebene angenommen. Grundtypen werden vollständig verworfen, wenn der Ebeneabstand für alle Vertices im Grundtyp 0 ist < . Mehrere Ullebenen können gleichzeitig verwendet werden, indem mehrere Komponenten eines oder mehrerer Vertexelemente als SV_CullDistance deklariert werden. Die kombinierten Clip- und Cull-Abstandswerte sind am meisten D3D#_CLIP_OR_CULL_DISTANCE_COUNT Komponenten in den meisten D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT Registern. Verfügbar für alle Shader, die gelesen oder geschrieben werden sollen, außer dem Vertex-Shader, der den Wert schreiben kann, aber nicht als Eingabe.
float
SV_Coverage Eine Maske, die auf Eingabe, Ausgabe oder beides eines Pixel-Shaders angegeben werden kann.
Für SV_Coverage auf einem Pixel-Shader wird DIE AUSGABE auf ps_4_1 oder höher unterstützt.
Für SV_Coverage auf einem Pixel-Shader erfordert INPUT ps_5_0 oder höher.
uint
SV_Depth Tiefenpufferdaten. Kann vom Pixelshader geschrieben werden. float
SV_DepthGreaterEqual In einem Pixel-Shader kann die Ausgabetiefe zulässig sein, solange sie größer oder gleich dem wert ist, der vom Rasterizer bestimmt wird. Ermöglicht das Anpassen der Tiefe, ohne frühzeitige Z zu deaktivieren. float
SV_DepthLessEqual In einem Pixel-Shader kann die Ausgabetiefe zulässig sein, solange sie kleiner oder gleich dem wert ist, der vom Rasterizer bestimmt wird. Ermöglicht das Anpassen der Tiefe, ohne frühzeitige Z zu deaktivieren. float
SV_DispatchThreadID Definiert den globalen Threadversatz innerhalb des Dispatch-Aufrufs pro Dimension der Gruppe. Verfügbar als Eingabe für den Compute-Shader. (schreibgeschützt) uint3
SV_DomainLocation Definiert die Position auf dem Rumpf des aktuellen Domänenpunkts, der ausgewertet wird. Verfügbar als Eingabe für den Domänen-Shader. (schreibgeschützt) float2|3
SV_GroupID Definiert den Gruppenversatz innerhalb eines Dispatch-Anrufs pro Dimension des Versandaufrufs. Verfügbar als Eingabe für den Computehader. (schreibgeschützt) uint3
SV_GroupIndex Stellt einen flachen Index für einen bestimmten Thread innerhalb einer bestimmten Gruppe bereit. Verfügbar als Eingabe für den Computehader. (schreibgeschützt) uint
SV_GroupThreadID Definiert den Threadversatz innerhalb der Gruppe pro Dimension der Gruppe. Verfügbar als Eingabe für den Computehader. (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 auf demselben Geometriegrundtyp aufgerufen werden kann. uint
SV_InnerCoverage Stellt unterschätzte konservative Rasterisierungsinformationen dar (d. h. ob ein Pixel garantiert abgedeckt ist). Kann vom Pixelshader gelesen oder geschrieben werden.
SV_InsideTessFactor Definiert den Tessellationsbetrag innerhalb einer Patchoberfläche. Verfügbar im Hull-Shader zum Schreiben und verfügbar im Domänen-Shader zum Lesen. float|float[2]
SV_InstanceID Automatisch generierter Bezeichner pro Instanz (siehe Verwenden von System-Generated Values (Direct3D 10)). Für alle Shader verfügbar.
SV_IsFrontFace Gibt an, ob ein Dreieck vor der Vorderseite liegt. Für Linien und Punkte weist IsFrontFace den Wert true auf. Die Ausnahme sind Linien aus Dreiecken (Drahtmodellmodus), die IsFrontFace auf die gleiche Weise wie das Rastern des Dreiecks im Volltonmodus festlegt. Kann vom Geometrie-Shader geschrieben und vom Pixelshader gelesen werden. bool
SV_OutputControlPointID Definiert den Index der Kontrollpunkt-ID, die von einem Aufruf des Haupteinstiegspunkts des Rumpf-Shaders betrieben wird. Kann nur vom Rumpf-Shader gelesen werden. uint
SV_Position Wenn SV_Position für die Eingabe an einen Shader deklariert wird, kann es einen von zwei Interpolationsmodi angeben: 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 das Pixelcenter mit einem Offset von 0,5 zu erhalten. float4
SV_PrimitiveID Pro Grundtypbezeichner, der automatisch von der Laufzeit generiert wird (siehe Verwenden von System-Generated Values (Direct3D 10)). Kann von den Geometrie- oder Pixel-Shadern geschrieben und durch die Geometrie, Pixel, Rumpf oder Domänen-Shader gelesen werden. uint
SV_RenderTargetArrayIndex Renderzielarrayindex. Wird auf die Geometrie-Shaderausgabe angewendet und gibt den Renderzielarray-Datenschnitt an, auf den der Grundtyp vom Pixelshader gezeichnet wird. SV_RenderTargetArrayIndex ist nur gültig, wenn es sich bei dem Renderziel um eine Arrayressource handelt. 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, welcher Arrayschnitt 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 ist true, wird SV_RenderTargetArrayIndex auf jeden Shader angewendet, der den Rasterizer zufüttert.
uint
SV_SampleIndex Beispielhäufigkeitsindexdaten. Verfügbar, um nur vom Pixelshader gelesen oder geschrieben zu werden. uint
SV_StencilRef Stellt den aktuellen Pixelshader-Schablonenverweiswert 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 Tessellationsmenge an jedem Rand eines Patchs. Verfügbar zum Schreiben im Hull-Shader und Lesen im Domänen-Shader. float[2|3|4]
SV_VertexID Per-Vertex-Bezeichner, der automatisch von der Laufzeit generiert wird (siehe Verwenden von System-Generated Werten (Direct3D 10)). Verfügbar als Eingabe nur für den Vertex-Shader. uint
SV_ViewportArrayIndex Viewport-Arrayindex. Auf die Geometrie-Shaderausgabe angewendet und gibt an, welche Viewport für den derzeit geschriebenen Grundtyp verwendet werden soll. Kann vom Pixel-Shader gelesen werden. Der Grundtyp wird transformiert und mit dem durch den Index angegebenen Viewport geclippt, bevor er an den Rasterizer übergeben wird. Diese Semantik gilt nur für Grundtypen; wenn ein Grundtyp mehr als einen Vertex aufweist, wird der Wert aus dem führenden Vertex verwendet.
Wenn D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer ist true, wird SV_ViewportArrayIndex auf jeden Shader angewendet, der den Rasterizer einfüge.
uint
SV_ShadingRate Definiert durch Schattierungsratenwerte die Anzahl der Pixel, die von einem Pixel-Shader-Aufruf für Variable Shading Rate Tier 2 oder höher geschrieben wurden. Kann aus dem Pixel-Shader gelesen werden. Kann aus einem Vertex- oder Geometrie-Shader geschrieben werden. uint

Einschränkungen beim Schreiben von SV_Depth:

  • Wenn multisampling (MultisampleEnable in D3D10_RASTERIZER_DESC) und das Schreiben eines Tiefenwerts (mit einem Pixel-Shader) verwendet wird, wird auch der einzelne Wert verwendet, der im Tiefentest geschrieben wird; Daher gehen die Möglichkeiten zum Rendern von Grundgrundrändern bei höherer Auflösung verloren, wenn multisampling.
  • Wenn Sie dynamische Flusssteuerung verwenden, ist es unmöglich, zu ermitteln, ob ein Shader, der SV_Depth in einigen Pfaden schreibt, SV_Depth in jeder Ausführung schreiben kann. Fehler beim Schreiben von SV_Depth beim deklarierten Verhalten (das möglicherweise oder nicht verwerfen des Pixels).
  • Jeder Float32-Wert einschließlich +/-INF und NaN kann in SV_Depth geschrieben werden.
  • Das Schreiben SV_Depth ist beim Ausführen der Dual Source Color Blending weiterhin gültig.

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 zu Direct3D 9 Semantik

Einige der Direct3D 10- und höher-Semantik weisen direkt Direct3D 9-Semantik auf.

Direct3D 10 Semantik Direct3D 9 Gleichwertige Semantik
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLOR

[!] Hinweis zu Direct3D 9-Entwicklern: Für Direct3D 9-Ziele muss Shader-Semantik gültigen Direct3D 9-Semantik zugeordnet werden. Für abwärtskompatible POSITION0 (und deren Variantennamen) wird ALS SV_Position behandelt, WIRD COLOR als SV_TARGET behandelt.

Direct3D 9 VPOS und Direct3D 10 SV_Position

Die semantische D3D10-SV_Position bietet ähnliche Funktionen wie das Direct3D 9 Shadermodell 3 VPOS Semantik. Beispielsweise wird in Direct3D 9 die folgende Syntax für einen Pixel-Shader mit Bildschirmraumkoordinaten verwendet:

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

VPOS wurde für Shadermodell 3-Unterstützung hinzugefügt, um Bildschirmraumkoordinaten anzugeben, da die POSITION-Semantik für Objektraumkoordinaten vorgesehen war.

In Direct3D 10 und höher gibt die SV_Position Semantik (bei Verwendung im Kontext eines Pixel-Shaders) Bildschirmraumkoordinaten an (offset by 0,5). Daher wäre der Direct3D 9-Shader ungefähr gleich (ohne die Abrechnung für den 0,5-Offset) wie folgt:

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

Wenn Sie von Direct3D 9 zu Direct3D 10 und höher migrieren, müssen Sie dies beim Übersetzen Ihrer Shader beachten.

Benutzerclipebenen in HLSL

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