Verwenden von System-Generated-Werten

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

Durch Das Anfügen von Daten, z. B. einer instance-ID (sichtbar für VS), einer Vertex-ID (sichtbar für VS) oder einer primitiven ID (sichtbar für GS/PS), kann eine nachfolgende Shaderphase nach diesen Systemwerten suchen, um die Verarbeitung in dieser Phase zu optimieren. Für instance kann die VS-Phase nach der instance ID suchen, um zusätzliche Daten pro Scheitelpunkt für den Shader zu erfassen oder andere Vorgänge auszuführen. Die GS- und PS-Phasen können die primitive ID verwenden, um Daten pro Primitive auf die gleiche Weise zu erfassen.

VertexID

Jede Shaderphase verwendet eine Vertex-ID, 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 der Grundtyp von der IA-Phase verarbeitet wird. Fügen Sie die Vertex-ID-Semantik an die Shadereingabedeklaration an, um die IA-Phase zu informieren, eine Pro-Scheitelpunkt-ID zu generieren.

Die IA fügt jedem Scheitelpunkt eine Vertex-ID zur Verwendung durch Shaderphasen hinzu. Für jeden Zeichnungsaufruf wird die Scheitelpunkt-ID um 1 erhöht. Bei indizierten Zeichnungsaufrufen wird die Anzahl auf den Startwert zurückgesetzt. Für ID3D11DeviceContext::D rawIndexed und ID3D11DeviceContext::D rawIndexedInstanced stellt die Vertex-ID den Indexwert dar. Wenn die Vertex-ID überläuft (größer als 2 ²– 1), wird sie auf 0 umgebrochen.

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

PrimitiveID

Jede Shaderphase verwendet eine primitive ID, um jeden Grundtyp zu identifizieren. Es handelt sich um eine 32-Bit-Ganzzahl ohne Vorzeichen, deren Standardwert 0 ist. Es wird einem Grundtyp zugewiesen, wenn der Grundtyp von der IA-Phase verarbeitet wird. Um die IA-Phase zu informieren, eine primitive ID zu generieren, fügen Sie die Primitive-ID-Semantik an die Shadereingabedeklaration an.

Die IA-Phase fügt jedem Grundtyp eine Primitive-ID zur Verwendung durch den Geometrie-Shader oder die Pixelshaderphase hinzu (je nachdem, welche phase nach der IA-Phase die erste aktive Phase ist). Für jeden indizierten Draw-Aufruf wird die primitive ID um 1 erhöht. Die primitive ID wird jedoch immer dann auf 0 zurückgesetzt, wenn eine neue instance beginnt. Alle anderen Draw-Aufrufe ändern den Wert der instance ID nicht. Wenn die instance ID überläuft (überschreitet 2 ²– 1), wird sie auf 0 umgebrochen.

Die Pixelshaderphase verfügt nicht über eine separate Eingabe für eine primitive ID. Jede Pixelshadereingabe, die eine primitive ID angibt, verwendet jedoch einen konstanten Interpolationsmodus.

Es gibt keine Unterstützung für das automatische Generieren einer Grundtyp-ID für angrenzende Grundtypen. Bei primitiven Typen mit Adjacency, z. B. einem Dreiecksstreifen mit Adjacency, wird eine Primitive-ID nur für die inneren Grundtypen (die nicht angrenzenden Grundtypen) beibehalten, genau wie die Gruppe von Grundtypen in einem Dreiecksstreifen ohne Adjazenz.

InstanceID

Jede Shaderphase verwendet eine instance-ID, um die instance der geometrie zu identifizieren, die derzeit verarbeitet wird. Es handelt sich um eine 32-Bit-Ganzzahl ohne Vorzeichen, deren Standardwert 0 ist.

Die IA-Phase fügt jedem Scheitelpunkt eine instance ID hinzu, wenn die Vertexshader-Eingabedeklaration die semantische instance ID enthält. Für jeden indizierten Zeichnungsaufruf wird instance ID um 1 erhöht. Alle anderen Draw-Aufrufe ändern den Wert von instance id nicht. Wenn instance ID überläuft (überschreitet 2 ²– 1), wird sie in 0 umgebrochen.

Beispiel

Die folgende Abbildung zeigt, wie Systemwerte an einen instanzierten Dreiecksstreifen in der IA-Phase angefügt werden.

Abbildung der Systemwerte für einen instanzierten Dreiecksstreifen

Diese Tabellen zeigen die Systemwerte, die für beide Instanzen des gleichen Dreiecksstreifens generiert werden. Die erste instance (instance U) wird blau angezeigt, die zweite instance (instance V) grün. Die durchgehenden 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 instance 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

 

Wert Wert Wert
PrimitiveID 0 1 2
InstanceID 0 0 0

 

Die folgenden Tabellen zeigen die vom System generierten Werte für die instance 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 (Scheitelpunkt, Grundtyp und instance); beachten Sie auch, dass jeder instance eine eindeutige instance ID erhält. Die Daten enden mit dem Streifenschnitt, der die einzelnen instance des Dreiecksstreifens trennt.

Eingabe-Assembler-Phase