Semantik

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

Im Allgemeinen sind daten, die zwischen Pipelinestufen übergeben werden, vollständig generisch und werden vom System nicht eindeutig interpretiert. Es ist eine beliebige Semantik zulässig, die keine besondere Bedeutung hat. Parameter (in Direct3D 10 und höher), die diese spezielle Semantik enthalten, werden als System-Wert-Semantik 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.

Vertex-Shadersemantik

Diese Semantik hat eine Bedeutung, wenn sie an einen Vertex-Shader-Parameter angefügt wird. 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] Indizes mischen uint
BLENDWEIGHT [ n] Mischungsgewichtungen float
COLOR [ n] Diffuse und speculare Farbe float4
NORMAL [ n] Normaler Vektor float4
POSITION [ n] Scheitelpunktposition im Objektbereich. float4
POSITIONT Transformierte Scheitelpunktposition. float4
PSIZE [ n] Punktgröße float
TANGENT [ n] Tangens float4
TEXCOORD [ n] Texturkoordinaten float4
Output BESCHREIBUNG type
COLOR [ n] Diffuse oder Glanzfarbe float4
NEBEL Scheitelpunkt-Scheitelpunkt float
POSITION [ n] Position eines Scheitelpunkts im homogenen Raum. Berechnen Sie die Position im Bildschirmbereich durch Division (x,y,z) durch w. Jeder Vertex-Shader muss einen Parameter mit dieser Semantik schreiben. float4
PSIZE Punktgröße float
TESSFACTOR [ n] Mosaikfaktor float

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

Pixelshadersemantik

Diese Semantik hat eine 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 ein primitives Hintergrundelement angibt. Ein negativer Wert steht rückwärts, während ein positiver Wert der Kamera gegenübersteht.
[!Note]
Diese Semantik ist im Direct3D 9-Shadermodell 3.0verfü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 Shader-Kompatibilitätsmodus gültig (d. b. wenn der Shader mit D3D10 SHADER ERSTELLT wird _ _ ENABLE _ BACKWARDS _ COMPATIBILITY).

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.

System-Value Semantik

Die Systemwertsemantik ist neu in Direct3D 10. Alle Systemwerte beginnen mit einem _ SV-Präfix. Ein gängiges Beispiel ist SV _ POSITION, das von der Rasterizerphase interpretiert wird. Die Systemwerte sind in anderen Teilen der Pipeline gültig. Die SV-Position kann z. B. _ als Eingabe für einen Vertex-Shader sowie als Ausgabe angegeben werden. Pixel-Shader können nur in Parameter mit der _ Systemwertsemantik SV Depth und SV _ Target schreiben.

Andere Systemwerte (SV _ VertexID, SV _ InstanceID, SV _ IsFrontFace) können nur in den ersten aktiven Shader in der Pipeline eingegeben werden, der den bestimmten Wert interpretieren kann. Danach muss die Shaderfunktion die Werte an nachfolgende Phasen übergeben.

SV _ PrimitiveID ist eine Ausnahme von dieser Regel, die nur in den ersten aktiven Shader in der Pipeline eingegeben wird, der den bestimmten Wert interpretieren kann. Die Hardware kann den gleichen ID-Wert wie die Eingabe für die Hüllen-Shader-Stufe, die Domänen-Shader-Stufe und danach die erste aktivierte Stufe bereitstellen: geometry-shader stage oder pixel-shader stage.

Wenn Mosaik aktiviert ist, sind die Stufen "hull-shader" und "domain-shader" vorhanden. Für einen bestimmten Patch gilt die gleiche PrimitiveID für den Hüllen-Shader-Aufruf des Patches und für alle Aufrufe von Tessellated Domain Shader. Dieselbe PrimitiveID wird auch an die nächste aktive Phase weitergegeben. geometry-shader stage oder pixel-shader stage ,wenn aktiviert.

Wenn der geometry-Shader SV _ PrimitiveID eingibt und weil er null oder ein oder mehrere Primitive pro Aufruf ausgeben kann, muss der Shader eine eigene Auswahl des SV _ PrimitiveID-Werts für jedes Primitive ausgeben, wenn ein nachfolgender Pixel-Shader SV _ PrimtiveID eingibt.

Als weiteres Beispiel kann SV _ PrimitiveID nicht von der Vertex-Shader-Stufe interpretiert werden, da ein Scheitelpunkt Ein Member mehrerer Primitive sein kann.

Diese Semantik wurde Direct3D 10 hinzugefügt. Sie sind in Direct3D 9 nicht verfügbar.

Systemwertsemantik für die Rasterizerphase.

System-Value Semantik Beschreibung type
SV _ ClipDistance [ n] Daten zum Clipabstand. Sv _ ClipDistance-Werte werden jeweils als float32-Abstand zu einer Ebene mit Vorzeichen angenommen. Primitive Setup ruft nur die Rasterung für Pixel auf, für die die interpolierten Ebenenabstand(en) >= 0 sind. Mehrere Clipebenen können gleichzeitig implementiert werden, indem mehrere Komponenten von einem oder mehreren Scheitelpunktelementen als SV _ ClipDistance deklariert werden. Die kombinierten Clip- und CULL-Entfernungswerte sind höchstens D3D # _ _ CLIP- ODER _ CULL _ DISTANCE _ COUNT-Komponenten in höchstens D3D # _ _ CLIP- ODER _ CULL _ DISTANCE ELEMENT _ _ COUNT-Registern. Verfügbar für alle Shader, in die gelesen oder geschrieben werden soll, mit Ausnahme des Vertex-Shaders, der den Wert schreiben, ihn jedoch nicht als Eingabe annehmen kann.
Das Clipplanes-Attribut funktioniert wie SV _ ClipDistance, funktioniert jedoch auf allen Hardwarefeatureebenen 9 _ x und höher. Weitere Informationen finden Sie unter User clip planes on feature level 9 hardware (Benutzer clip planes on feature level 9 hardware ( Benutzer clip planes on feature level 9 hardware).
float
SV _ CullDistance [ n] Cull-Entfernungsdaten. Wenn Komponenten von Scheitelpunktelementen diese Bezeichnung erhalten, wird jeweils davon ausgegangen, dass es sich bei diesen Werten um einen float32-Abstand zu einer Ebene mit Vorzeichen handelt. Primitive werden vollständig verworfen, wenn die Ebenendistanz(en) für alle Scheitelpunkte im Primitiven < 0 ist. Mehrere CULL-Ebenen können gleichzeitig verwendet werden, indem mehrere Komponenten eines oder mehrerer Scheitelpunktelemente als SV _ CullDistance deklariert werden. Die kombinierten Clip- und CULL-Entfernungswerte sind höchstens D3D # _ _ CLIP- ODER _ CULL _ DISTANCE _ COUNT-Komponenten in höchstens D3D # _ _ CLIP- ODER _ CULL _ DISTANCE ELEMENT _ _ COUNT-Registern. Verfügbar für alle Shader, in die gelesen oder geschrieben werden soll, mit Ausnahme des Vertex-Shaders, der den Wert schreiben, ihn jedoch nicht als Eingabe annehmen kann.
float
_SV-Abdeckung Eine Maske, die bei der Eingabe, Ausgabe oder bei beiden Pixel-Shadern angegeben werden kann.
Für die _ SV-Abdeckung für einen Pixel-Shader wird OUTPUT auf PS _ 4 _ 1 oder höher unterstützt.
Für die _ SV-Abdeckung für einen Pixel-Shader erfordert INPUT PS _ 5 _ 0 oder höher.
uint
_SV-Tiefe Tiefenpufferdaten. Kann vom Pixel-Shader geschrieben werden. float
SV _ DepthGreaterEqual In einem Pixel-Shader lässt die Ausgabetiefe zu, solange sie größer oder gleich dem vom Rasterizer festgelegten Wert ist. Ermöglicht das Anpassen der Tiefe, ohne das frühe Z zu deaktivieren. float
SV _ DepthLessEqual In einem Pixel-Shader lässt die Ausgabetiefe zu, solange sie kleiner oder gleich dem vom Rasterizer festgelegten Wert ist. Ermöglicht das Anpassen der Tiefe, ohne das frühe Z zu deaktivieren. float
SV _ DispatchThreadID Definiert den globalen Threadoffset innerhalb des Dispatch-Aufrufs pro Dimension der Gruppe. Verfügbar als Eingabe für den Compute-Shader. (schreibgeschützte) uint3
SV _ DomainLocation Definiert den Speicherort auf der Hülle des aktuellen Domänenpunkts, der ausgewertet wird. Verfügbar als Eingabe für den Domänen-Shader. (schreibgeschützte) float2 | 3
SV _ GroupID Definiert den Gruppenoffset innerhalb eines Dispatchaufrufs pro Dimension des Dispatchaufrufs. Verfügbar als Eingabe für den Compute-Shader. (schreibgeschützte) uint3
SV _ GroupIndex Stellt einen flachen Index für einen bestimmten Thread innerhalb einer bestimmten Gruppe bereit. Verfügbar als Eingabe für den Compute-Shader. (schreibgeschützte) uint
SV _ GroupThreadID Definiert den Threadoffset innerhalb der Gruppe pro Dimension der Gruppe. Verfügbar als Eingabe für den Compute-Shader. (schreibgeschützte) uint3
SV _ GSInstanceID Definiert die Instanz des geometry-Shaders. Verfügbar als Eingabe für den geometry-Shader. Die -Instanz ist erforderlich, da ein Geometrie-Shader bis zu 32-mal auf demselben geometry-Primitiven aufgerufen werden kann. uint
SV _ InnerCoverage Stellt dekonstruierte konservative Rasterungsinformationen dar (d. h., ob ein Pixel garantiert vollständig abgedeckt wird). Kann vom Pixelshader gelesen oder geschrieben werden.
SV _ InsideTessFactor Definiert den Mosaikbetrag innerhalb einer Patchoberfläche. Verfügbar im Hüllen-Shader zum Schreiben und im Domänen-Shader zum Lesen. float | float [ 2]
SV _ InstanceID Bezeichner pro Instanz, der automatisch von der Laufzeit generiert wird (siehe Using System-Generated Values (Direct3D 10) (Verwenden von System-Generated-Werten (Direct3D 10)). Für alle Shader verfügbar.
SV _ IsFrontFace Gibt an, ob ein Dreieck nach vorne ausgerichtet ist. Für Linien und Punkte hat IsFrontFace den Wert true. Die Ausnahme sind Linien, die aus Dreiecken gezeichnet werden (Wireframe-Modus), wodurch IsFrontFace auf die gleiche Weise wie das Rastern des Dreiecks im Vollbildmodus festgelegt wird. Kann vom Geometry-Shader in geschrieben und vom Pixelshader gelesen werden. bool
SV _ OutputControlPointID Definiert den Index der Kontrollpunkt-ID, die durch einen Aufruf des Haupteinstiegspunkts des Hüllen-Shaders betrieben wird. Kann nur vom Hüllen-Shader gelesen werden. uint
_SV-Position Wenn SV _ Position für die Eingabe für einen Shader deklariert wird, kann einer von zwei Interpolationsmodi angegeben werden: linearNoPerspective oder linearNoPerspectiveCentroid, wobei letzteres dazu führt, dass beim Multisample-Antialiasing mit schwerpunktid-snapped xyzw Werte bereitgestellt werden. Bei Verwendung in einem Shader beschreibt SV _ Position die Pixelposition. Verfügbar in allen Shadern, um die Pixelmitte mit einem Offset von 0,5 abzurufen. float4
SV _ PrimitiveID Pro primitivem Bezeichner, der automatisch von der Laufzeit generiert wird (siehe Verwenden von System-Generated-Werten (Direct3D 10)). Kann von den Geometrie- oder Pixel-Shadern in geschrieben und von den Geometrie-, Pixel-, Hüllen- oder Domänen-Shadern gelesen werden. uint
SV _ RenderTargetArrayIndex Renderzielarrayindex. Wird auf die Geometrie-Shaderausgabe angewendet und gibt den Renderzielarrayslice an, auf den der Primitive vom Pixel-Shader gezeichnet wird. SV _ RenderTargetArrayIndex ist nur gültig, wenn das Renderziel eine Arrayressource ist. Diese Semantik gilt nur für Primitive. Wenn ein Primitiver über mehrere Scheitelpunkte verfügt, wird der Wert des führenden Scheitelpunkts verwendet. Dieser Wert gibt auch an, welcher Arrayslice einer Tiefen-/Schablonenansicht zu Lese-/Schreibzwecken 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 den Rasterizer einspeist.
uint
SV _ SampleIndex Beispielhäufigkeitsindexdaten. Nur verfügbar, um vom Pixelshader gelesen oder in diesen geschrieben zu werden. uint
SV _ StencilRef Stellt den aktuellen Schablonenverweiswert des Pixelshader dar. Kann nur vom Pixelshader geschrieben werden. uint
_SV-Ziel [ ] n, wobei 0 <= n <= 7 Der Ausgabewert, der in einem Renderziel gespeichert wird. Der Index gibt an, in welche der acht möglicherweise gebundenen Renderziele geschrieben werden soll. Der Wert ist für alle Shader verfügbar. float [ 2 | 3 | 4]
SV _ TessFactor Definiert den Mosaikbetrag an jedem Rand eines Patches. Verfügbar zum Schreiben im Hüllen-Shader und zum Lesen im Domänen-Shader. float [ 2 | 3 | 4]
SV _ VertexID Bezeichner pro Scheitelpunkt, der automatisch von der Laufzeit generiert wird (siehe Using System-Generated Values (Direct3D 10) (Verwenden von System-Generated-Werten (Direct3D 10)). Nur als Eingabe für den Vertex-Shader verfügbar. uint
SV _ ViewportArrayIndex Viewportarrayindex. Wird auf die Geometry-Shaderausgabe angewendet und gibt an, welcher Viewport für den primitiven , der gerade geschrieben wird, verwendet werden soll. Kann vom Pixelshader gelesen werden. Das Primitiv wird transformiert und mit dem Viewport abgeschnitten, der vom Index angegeben wird, bevor er an den Rasterizer übergeben wird. Diese Semantik gilt nur für Primitive. Wenn ein Primitiver über mehrere Scheitelpunkte verfügt, wird der Wert des führenden Scheitelpunkts verwendet.
Wenn D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer true ist, wird SV _ ViewportArrayIndex auf jeden Shader angewendet, der den Rasterizer einspeist.
uint
SV _ ShadingRate Definiert durch Schattierungsratenwerte die Anzahl der Pixel, die von einem Pixel-Shaderaufruf für Geräte mit variabler Schattierungsrate (Ebene 2 oder höher) geschrieben wurden. Kann aus dem Pixelshader gelesen werden. Kann aus einem Scheitelpunkt- oder Geometrie-Shader geschrieben werden. uint

Einschränkungen beim Schreiben von _ SV-Tiefe:

  • Wenn Multisampling (MultisampleEnable ist in D3D10 _ RASTERIZER _ DESC true) und ein Tiefenwert (mit einem Pixel-Shader) geschrieben wird, wird der einzelne geschriebene Wert auch im Tiefentestverwendet. Daher geht die Möglichkeit zum Rendern primitiver Kanten mit höherer Auflösung verloren, wenn Multisampling durchgeführt wird.
  • Wenn Sie die dynamische Flusssteuerung verwenden, ist es unmöglich, zur Kompilierzeit zu bestimmen, ob ein Shader, der SV Depth in einigen Pfaden schreibt, _ bei jeder Ausführung garantiert _ SV-Tiefe schreibt. Fehler beim Schreiben der SV-Tiefe, wenn deklariert wird, führt zu _ einem nicht definierten Verhalten (das die Verwerfung des Pixels enthalten kann oder nicht).
  • Jeder float32-Wert, einschließlich +/-INF und NaN, kann in SV Depth geschrieben _ werden.
  • Das Schreiben der _ SV-Tiefe ist weiterhin gültig, wenn Dual Source Color Blending ausgeführt wird.

Migration von Direct3D 9 zu Direct3D 10 und höher

Bei der Migration von Code von Direct3D 9 zu Direct3D 10 und höher sollten die folgenden Probleme berücksichtigt werden:

Zuordnung zur Direct3D 9-Semantik

Einige der Direct3D 10- und höher-Semantik werden direkt der Direct3D 9-Semantik zugeordnet.

Direct3D 10 Semantic Äquivalente Semantik von Direct3D 9
_SV-Tiefe DEPTH
_SV-Position POSITION
_SV-Ziel COLOR

[!] Hinweis für Direct3D 9-Entwickler: Für Direct3D 9-Ziele muss die Shadersemantik einer gültigen Direct3D 9-Semantik zugeordnet werden. Aus Gründen der Abwärtskompatibilität wird POSITION0 (und seine Variantennamen) als _ SV-Position behandelt, COLOR als SV _ TARGET.

Direct3D 9 VPOS und Direct3D 10 _ SV-Position

Die semantische SV-Position D3D10 _ bietet ähnliche Funktionen wie die Semantik des Direct3D 9-Shadermodells 3 VPOS. Beispielsweise wird in Direct3D 9 die folgende Syntax für einen Pixelshader mit Bildschirmraumkoordinaten verwendet:

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

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

In Direct3D 10 und höher gibt die _ SV-Positionssemantik (bei Verwendung im Kontext eines Pixel-Shaders) Bildschirmraumkoordinaten an (Offset um 0,5). Daher wäre der Direct3D 9-Shader ungefähr gleichwertig (ohne 0,5 Offset) wie folgt:

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

Bei der Migration von Direct3D 9 zu Direct3D 10 und höher müssen Sie dies beachten, wenn Sie Ihre Shader übersetzen.

Benutzerclipebenen in HLSL

Ab Windows 8 können Sie das Clipplanes-Funktionsattribut in einer HLSL-Funktionsdeklaration anstelle von SV ClipDistance verwenden, damit Ihr _ Shader sowohl auf Featureebene 9 x als auch auf _ Featureebene 10 und höher funktioniert. Weitere Informationen finden Sie unter User clip planes on feature level 9 hardware (Benutzer clip planes on feature level 9 hardware ( Benutzer clip planes on feature level 9 hardware).