Freigeben über


Verwenden von vom System generierten Werten

Vom System generierte Werte werden von der Eingabeassemblerphase (IA) (basierend auf vom Benutzer bereitgestellten Eingaben Semantik) generiert, um bestimmte Effizienzen in Shadervorgängen zu ermöglichen. Durch das Anfügen von Daten, wie etwa einer Instanz-ID (sichtbar in der Vertex Shader (VS) Phase), einer Vertex-ID (sichtbar in der VS), oder einer Primitive-ID (sichtbar in der Geometry Shader (GS) Phase/Pixel Shader (PS) Phase), kann eine nachfolgende Shader-Phase diese Systemwerte zur Optimierung der Verarbeitung in jener Phase verwenden.

Beispielsweise kann die VS-Phase nach der Instanz-ID suchen, um zusätzliche Daten pro Vertex für den Shader zu erfassen oder andere Vorgänge auszuführen; die GS- und PS-Phasen können die Primitiv-ID verwenden, um Daten pro Primitiv auf die gleiche Weise zu erfassen.

VertexID

Eine Vertex-ID wird von jeder Shaderstufe verwendet, um jeden Scheitelpunkt zu identifizieren. Es handelt sich um eine 32-Bit-ganzzahl ohne Vorzeichen, deren Standardwert 0 ist. Es wird einem Scheitelpunkt zugewiesen, wenn das Primitive von der Eingabe-Assembler-Stufe (IA)verarbeitet wird. Fügen Sie die Vertex-ID-Semantik an die Shadereingabedeklaration an, um die IA-Phase zu veranlassen, eine ID pro Scheitelpunkt zu generieren.

Die IA fügt jedem Scheitelpunkt eine Scheitelpunkt-ID zur Verwendung in Shader-Phasen hinzu. Für jeden Draw-Aufruf wird die Vertex-ID um 1 erhöht. Bei indizierten Draw-Aufrufen wird die Anzahl wieder auf den Startwert zurückgesetzt. Wenn die Vertex-ID überläuft (überschreitet 2³²– 1), wird sie auf 0 zurückgesetzt.

Für alle primitiven Typen haben Knoten eine Vertex-ID (unabhängig von Adjazenz).

PrimitiveID

Eine Grundtyp-ID wird von jeder Shaderstufe verwendet, um jeden Grundtyp zu identifizieren. Es handelt sich um eine 32-Bit-ganzzahl ohne Vorzeichen, deren Standardwert 0 ist. Es wird einem Primitive zugewiesen, wenn das Primitive von der Input Assembler-Stufe (IA)verarbeitet wird. Um die IA-Stufe darüber zu informieren, eine Primitive-ID zu generieren, fügen Sie die Primitive-ID-Semantik zur Shadereingabedeklaration hinzu.

In der IA-Phase wird jedem Primitive eine Primitive-ID für die Verwendung durch die Geometrie-Shader-Stufe (GS) oder die Vertex-Shader-Stufe (VS) hinzugefügt (je nachdem, welche Stufe nach der IA-Phase als erste aktiv ist). Für jeden indizierten Draw-Aufruf wird die Grundtyp-ID um 1 erhöht, die Grundtyp-ID wird jedoch bei Jedem Start einer neuen Instanz auf 0 zurückgesetzt. Alle anderen Draw-Aufrufe ändern nicht den Wert der Instanz-ID. Wenn die Instanz-ID überläuft (2³²– 1 überschreitet), wird sie auf 0 zurückgesetzt.

Die Pixelshaderphase (PS) verfügt nicht über eine separate Eingabe für eine Primitiv-ID. Allerdings verwendet jede Pixelshadereingabe, die eine Primitiv-ID angibt, einen konstanten Interpolationsmodus.

Es gibt keine Unterstützung für die automatische Generierung einer Grundtyp-ID für angrenzende Grundtypen. Bei Primitiventypen mit Angrenzung, z. B. einem Dreiecksstreifen mit Angrenzungen, wird eine Primitiv-ID nur für die inneren Primitiven (die nicht angrenzenden Primitiven) beibehalten, genau wie die Gruppe von Primitiven in einem Dreiecksstreifen ohne Angrenzungen.

InstanzID

Eine Instanz-ID wird von jeder Shaderstufe verwendet, um die Instanz der Geometrie zu identifizieren, die derzeit verarbeitet wird. Es handelt sich um eine 32-Bit-ganzzahl ohne Vorzeichen, deren Standardwert 0 ist.

Die Eingabe Assembler-Phase (IA) fügt jedem Vertex eine Instanz-ID hinzu, wenn die Deklaration des Vertex Shaders die Instanz-ID-Semantik enthält. Für jeden indizierten Draw-Aufruf wird die Instanz-ID um 1 erhöht. Alle anderen Draw Calls ändern nicht den Wert der Instanz-ID. Wenn die Instanz-ID überläuft (2³²– 1 überschreitet), springt sie zurück auf 0.

Beispiel

Die folgende Abbildung zeigt, wie Systemwerte an eine instanzierte Dreiecksleiste in der Eingabeassemblerphase (IA)angefügt werden.

Abbildung von Systemwerten für einen instanzierten Dreiecksstreifen

Diese Tabellen zeigen die Systemwerte, die für beide Instanzen desselben Dreiecksstreifens generiert wurden. Die erste Instanz (Instanz U) wird blau angezeigt, die zweite Instanz (Instanz V) wird grün angezeigt. Die durchgezogenen Linien verbinden die Scheitelpunkte in den Grundtypen, die gestrichelten Linien verbinden die angrenzenden Scheitelpunkte.

Die folgenden Tabellen zeigen die vom System generierten Werte für die Instanz U.

Vertexdaten C,U D,U E,U Fick dich G,U H,U I,U J,U K,U L,U
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

Die Dreiecksstreifeninstanz U verfügt über drei Dreiecksgrundtypen mit den folgenden vom System generierten Werten:

Wert 1 Wert 2 Wert 3
PrimitiveID 0 1 2
InstanceID 0 0 0

 

Die folgenden Tabellen zeigen die vom System generierten Werte für die Instanz V.

Vertexdaten C,V D,V E,V F,V G,V H,V I,V J,V K,V L,V
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

Dreiecksstreifeninstanz V verfügt über drei Dreiecksprimitive mit den folgenden systemgenerierten Werten:

Wert 1 Wert 2 Wert 3
PrimitiveID 0 1 2
InstanceID 1 1 1

 

Die Eingabeassemblerphase (IA) generiert die IDs (Vertex, Grundtyp und Instanz); beachten Sie auch, dass jede Instanz eine eindeutige Instanz-ID erhält. Die Daten enden mit dem Streifenschnitt, der jede Instanz des Dreiecksstreifens trennt.

Input-Assembler (IA)-Phase