Uso di valori System-Generated

I valori generati dal sistema vengono generati dalla fase IA (basata sulla semantica di input fornita dall'utente) per consentire determinate efficienza nelle operazioni shader.

Associando dati, ad esempio un ID istanza (visibile a VS), un ID vertice (visibile a VS) o un ID primitivo (visibile a GS/PS), una fase dello shader successiva può cercare questi valori di sistema per ottimizzare l'elaborazione in tale fase. Ad esempio, la fase VS può cercare l'ID istanza per acquisire dati aggiuntivi per vertice per lo shader o per eseguire altre operazioni; le fasi GS e PS possono usare l'ID primitivo per acquisire dati per primitiva nello stesso modo.

VertexID

Un ID vertice viene usato da ogni fase shader per identificare ogni vertice. È un intero senza segno a 32 bit il cui valore predefinito è 0. Viene assegnato a un vertice quando la primitiva viene elaborata dalla fase IA. Collegare la semantica vertex-id alla dichiarazione di input shader per informare la fase IA per generare un ID per vertice.

L'IA aggiungerà un ID vertice a ogni vertice per l'uso da parte delle fasi shader. Per ogni chiamata di disegno, l'ID vertice viene incrementato di 1. Tra le chiamate di disegno indicizzate, il conteggio ripristina il valore iniziale. Per ID3D11DeviceContext::D rawIndexed e ID3D11DeviceContext::D rawIndexedInstanced, l'ID vertice rappresenta il valore dell'indice. Se il vertex id overflows (supera 2³²– 1), viene eseguito il wrapping su 0.

Per tutti i tipi primitivi, i vertici hanno un ID vertice associato a loro (indipendentemente dall'ajacency).

PrimitiveID

Un ID primitivo viene usato da ogni fase shader per identificare ogni primitiva. È un intero senza segno a 32 bit il cui valore predefinito è 0. Viene assegnato a una primitiva quando la primitiva viene elaborata dalla fase IA. Per informare la fase IA per generare un ID primitivo, collegare la semantica primitive-ID alla dichiarazione di input shader.

La fase IA aggiungerà un ID primitivo a ogni primitiva per l'uso dal geometry shader o dalla fase pixel shader (ovvero la prima fase attiva dopo la fase IA). Per ogni chiamata di disegno indicizzata, l'ID primitivo viene incrementato di 1, tuttavia, l'ID primitivo viene reimpostato su 0 ogni volta che inizia una nuova istanza. Tutte le altre chiamate di disegno non modificano il valore dell'ID istanza. Se il overflow dell'ID dell'istanza (supera 2³²- 1), viene eseguito il wrapping su 0.

La fase pixel shader non ha un input separato per un ID primitivo; tuttavia, qualsiasi input pixel shader che specifica un ID primitivo usa una modalità di interpolazione costante.

Non è disponibile alcun supporto per la generazione automatica di un ID primitivo per le primitive adiacenti. Per i tipi primitivi con ajacency, ad esempio una striscia di triangoli con adjacency, un ID primitivo viene mantenuto solo per le primitive interne (le primitive non adiacenti), proprio come il set di primitive in una striscia di triangoli senza ajacency.

InstanceID

Un ID istanza viene usato da ogni fase shader per identificare l'istanza della geometria attualmente elaborata. È un intero senza segno a 32 bit il cui valore predefinito è 0.

La fase IA aggiungerà un ID istanza a ogni vertice se la dichiarazione di input del vertex shader include la semantica dell'ID istanza. Per ogni chiamata di disegno indicizzata, l'ID istanza viene incrementato da 1. Tutte le altre chiamate di disegno non modificano il valore dell'ID istanza. Se l'id dell'istanza supera il valore 2³²-1, viene eseguito il wrapping su 0.

Esempio

Nella figura seguente viene illustrato il modo in cui i valori di sistema vengono collegati a una striscia di triangoli istanza nella fase IA.

illustrazione dei valori di sistema per una striscia di triangoli istanza

Queste tabelle mostrano i valori di sistema generati per entrambe le istanze dello stesso strip triangolo. La prima istanza (istanza U) viene visualizzata in blu, la seconda istanza (istanza V) viene visualizzata in verde. Le linee solide connettono i vertici nelle primitive, le linee tratteggiate connettono i vertici adiacenti.

Le tabelle seguenti mostrano i valori generati dal sistema per l'istanza U.

Dati dei vertici C,U D,U E,U FANCULO 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

 

Valore Valore Valore
PrimitiveID 0 1 2
InstanceID 0 0 0

 

Le tabelle seguenti mostrano i valori generati dal sistema per l'istanza V.

Dati dei vertici 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

 

Valore Valore Valore
PrimitiveID 0 1 2
InstanceID 1 1 1

 

L'assembler di input genera gli ID (vertice, primitivo e istanza); si noti anche che ogni istanza viene assegnata a un ID istanza univoco. I dati terminano con il taglio della striscia, che separa ogni istanza della striscia di triangoli.

Fase dell'assembler di input