Verwenden von systemgenerierten Werten

Vom System generierte Werte werden von der IA-Phase (basierend auf der vom Benutzer bereitgestellten Eingabesemantik) generiert, um bestimmte Effizienzen in Shadervorgängen zu ermöglichen.

Durch Das Anfügen von Daten, z. B. eine Instanz-ID (sichtbar für VS), eine Vertex-ID (sichtbar für VS) oder eine Grundtyp-ID (sichtbar für GS/PS), kann eine nachfolgende Shaderphase nach diesen Systemwerten suchen, um die Verarbeitung in dieser Phase zu optimieren. Die VS-Stufe kann beispielsweise nach der Instanz-ID suchen, um zusätzliche pro Vertex vorliegende Daten für den Shader abzurufen oder andere Operationen durchzuführen; die GS- und PS-Stufen können die Primitive-ID auf die gleiche Weise nutzen, um pro Primitiv vorliegende Daten abzurufen.

Note

Diese vom Direct3D-System generierten Werte gelten für Apps, unabhängig davon, ob sie das Win32- oder UWP-App-Modell verwenden.

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. Sie wird einem Vertex zugewiesen, wenn die Primitive von der IA-Stufe verarbeitet wird. Fügen Sie die Semantik „vertex-id“ an die Eingabedeklaration des Shaders an, um die IA-Phase anzuweisen, eine ID pro Vertex zu generieren.

Die IA fügt jedem Vertex eine Vertex-ID zur Verwendung in den Shaderphasen hinzu. Für jeden Draw-Aufruf wird die Vertex-ID um 1 erhöht. Über indizierte Draw-Aufrufe hinweg wird der Zählwert wieder auf den Startwert zurückgesetzt. Für ID3D11DeviceContext::DrawIndexed und ID3D11DeviceContext::DrawIndexedInstanced stellt die Vertex-ID den Indexwert dar. Wenn die Vertex-ID überläuft (2³²–1 überschreitet), springt sie auf 0 zurück.

Für alle Grundtypen verfügen Scheitelpunkte über eine Vertex-ID, die ihnen zugeordnet ist (unabhängig von der Nähe).

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. Sie wird einem Grundtyp zugewiesen, wenn der Grundtyp von der IA-Phase verarbeitet wird. Um die IA-Phase anzuweisen, eine Primitive-ID zu generieren, fügen Sie der Shader-Eingabedeklaration die Primitive-ID-Semantik hinzu.

Die IA-Phase fügt jeder Primitive eine Primitive-ID hinzu, die vom Geometrie-Shader oder von der Pixel-Shader-Phase verwendet wird (je nachdem, welche davon die erste nach der IA-Phase aktive Phase ist). Für jeden indizierten Draw-Aufruf wird die Primitive-ID um 1 erhöht, jedoch wird die Primitive-ID bei jedem Beginn einer neuen Instanz auf 0 zurückgesetzt. Alle anderen Draw-Aufrufe ändern den Wert der Instanz-ID nicht. Wenn die Instanz-ID überläuft (2³² - 1 überschreitet), springt sie auf 0 zurück.

Die Pixelshaderstufe verfügt nicht über eine separate Eingabe für eine Primitive-ID. Allerdings verwendet jede Pixelshadereingabe, die eine Grundtyp-ID angibt, einen konstanten Interpolationsmodus.

Es gibt keine Unterstützung für die automatische Generierung einer Grundtyp-ID für benachbarte Grundtypen. Bei Primitivtypen mit Adjazenz, wie z. B. einem Dreiecksstreifen mit Adjazenz, wird eine Primitive-ID nur für die inneren Primitive (die nicht an die Adjazenz angrenzenden Primitive) beibehalten, genau wie für die Menge an Primitiven in einem Dreiecksstreifen ohne Adjazenz.

InstanceID

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

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

Example

Die folgende Abbildung zeigt, wie Systemwerte in der IA-Phase an eine instanzierte Dreiecksleiste 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 innerhalb der Primitive, die gestrichelten Linien verbinden die benachbarten Scheitelpunkte.

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

Vertexdaten C,U D,U E,U F,U 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

 

Wert Wert Wert
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

 

Wert Wert Wert
PrimitiveID 0 1 2
InstanceID 1 1 1

 

Der Eingabeassembler 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-Stufe