Utilizzo di valori generati dal sistema
I valori generati dal sistema vengono generati dalla fase Input Assembler (IA) (in base alla semantica di input fornita dall'utente)) per consentire determinate efficienze nelle operazioni shader. Collegando dati, ad esempio un ID istanza (visibile alla fase Vertex Shader (VS)), un ID vertice (visibile a Visual Studio) o un ID primitiva (visibile alla fase Geometry Shader (GS)/fase Pixel Shader (PS)), una fase dello shader successiva può cercare questi valori di sistema per ottimizzare l'elaborazione in tale fase.
Ad esempio, la fase di Visual Studio 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 primitiva per acquisire i dati per primitiva nello stesso modo.
VertexID
Un ID vertice viene usato da ogni fase dello 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 input assembler (IA). Collegare la semantica ID vertice alla dichiarazione di input dello shader per informare la fase IA di generare un ID per vertice.
L'IA aggiungerà un ID vertice a ogni vertice per l'uso da parte delle fasi dello shader. Per ogni chiamata di disegno, l'ID vertice viene incrementato di 1. Tra le chiamate di disegno indicizzate, il conteggio viene reimpostato sul valore iniziale. Se l'ID del vertice eccede (supera 2³²– 1), torna a 0.
Per tutti i tipi di primitive, ai vertici è associato un ID vertice (indipendentemente dall'adiacenza).
PrimitiveID
Un ID primitiva viene usato da ogni fase dello 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 input assembler (IA). Per informare la fase IA di generare un ID primitiva, allegare la semantica dell'ID primitiva alla dichiarazione di input dello shader.
La fase IA aggiungerà un ID primitiva a ogni primitiva per l'uso dalla fase Geometry Shader (GS) o dalla fase Vertex Shader (VS) (indipendentemente dalla prima fase attiva dopo la fase IA). Per ogni chiamata di disegno indicizzata, l'ID primitiva viene incrementato di 1, ma l'ID primitiva 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 l'ID istanza eccede (supera 2³²– 1), torna a 0.
La fase Pixel Shader (PS) non dispone di un input separato per un ID primitiva. Tuttavia, qualsiasi input pixel shader che specifica un ID primitiva usa una modalità di interpolazione costante.
Non è disponibile alcun supporto per la generazione automatica di un ID primitiva per le primitive adiacenti. Per i tipi di primitiva con adiacenza, ad esempio una striscia di triangoli con adiacenza, un ID primitiva viene mantenuta solo per le primitive interne (primitive non adiacenti), proprio come il set di primitive in una striscia di triangoli senza adiacenza.
InstanceID
Un ID istanza viene usato da ogni fase dello shader per identificare l'istanza della geometria attualmente in fase di elaborazione. È un intero senza segno a 32 bit il cui valore predefinito è 0.
La fase Input Assembler (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 di 1. Tutte le altre chiamate di disegno non modificano il valore dell'ID istanza. Se l'ID istanza eccede (supera 2³²– 1), torna a 0.
Esempio
La figura seguente mostra come i valori di sistema vengono associati a una striscia di triangoli a istanza nella fase Input Assembler (IA).
Queste tabelle mostrano i valori di sistema generati per entrambe le istanze della stessa striscia di triangoli. La prima istanza (istanza U) viene visualizzata in blu, la seconda istanza (istanza V) viene visualizzata in verde. Le linee solide collegano i vertici nelle primitive, le linee tratteggiate collegano i vertici adiacenti.
Le tabelle seguenti mostrano i valori generati dal sistema per l'istanza U.
aggiornati | 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 |
L'istanza della striscia di triangoli U ha 3 primitive triangolari, con i seguenti valori generati dal sistema:
Valore 1 | Valore 2 | Valore 3 | |
---|---|---|---|
PrimitiveID | 0 | 1 | 2 |
InstanceID | 0 | 0 | 0 |
Le tabelle seguenti mostrano i valori generati dal sistema per l'istanza V.
aggiornati | 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 |
L'istanza della striscia di triangoli V ha 3 primitive triangolari, con i seguenti valori generati dal sistema:
Valore 1 | Valore 2 | Valore 3 | |
---|---|---|---|
PrimitiveID | 0 | 1 | 2 |
InstanceID | 1 | 1 | 1 |
La fase Input Assembler (IA) genera gli ID (vertice, primitiva e istanza). Si noti anche che a ogni istanza viene assegnato un ID istanza univoco. I dati terminano con il taglio della striscia, che separa ciascuna istanza della striscia di triangoli.
Argomenti correlati