Condividi tramite


Uso di valori generati dal sistema

I valori generati dal sistema vengono generati dalla fase dell'assemblatore di input (IA) (in base alle semantiche dell'input fornito dall'utente ) per consentire determinate efficienze nelle operazioni dello shader. Associando dati, ad esempio un ID istanza (visibile alla fase Vertex Shader (VS)), un ID vertice (visibile alla fase VS) o un ID primitivo (visibile alla fase Geometry Shader (GS)/Pixel Shader (PS)), una fase dello shader successiva può cercare questi valori di sistema per ottimizzare l'elaborazione in tale fase.

Ad esempio, lo stadio VS (Vertex Shader) può cercare l'ID istanza per acquisire dati per-vertice aggiuntivi per lo shader o per eseguire altre operazioni; gli stadi GS e PS possono usare l'ID primitivo per acquisire i dati per-primitive nello stesso modo.

VertexID

Un ID di vertice viene usato da ogni stadio dello shader per identificare ciascun 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). Associare la semantica vertex-ID alla dichiarazione di input dello shader per informare la fase IA nella generazione di un ID per vertice.

L'IA aggiungerà un ID del 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 draw indicizzate, il conteggio viene reimpostato sul valore iniziale. Se l'ID del vertice supera 2³²– 1, viene riportato a 0.

Per tutti i tipi primitivi, ai vertici è associato un ID vertice (indipendentemente dall'adiacenza).

PrimitiveID

Un ID primitivo 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 primitivo, collegare la semantica primitive-ID alla dichiarazione di input dello shader.

La fase IA aggiungerà un ID primitivo a ogni primitiva per l'uso nella fase Geometry Shader (GS) o nella fase Vertex Shader (VS), indipendentemente da quale sia la prima fase attiva dopo la fase IA. Per ogni chiamata di disegno indicizzata, l'ID primitivo viene incrementato di 1, ma 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 l'ID dell'istanza supera il valore di 2³²– 1, viene azzerato e torna a 0.

La fase Pixel Shader (PS) non dispone di un input dedicato per un ID primitivo; tuttavia, qualsiasi input del 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 adiacenza, ad esempio una striscia di triangoli con adiacenza, un ID primitivo viene mantenuto solo per le primitive interne (primitive non adiacenti), proprio come il set di primitive in una striscia di triangoli senza adiacenza.

InstanceID

Un identificatore di istanza viene usato da ogni stadio dello shader per identificare l'istanza della geometria attualmente elaborata. È 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 dello shader di vertice include la semantica dell'ID istanza. Per ogni chiamata di disegno indicizzata, l'ID istanza viene incrementato di 1. Nessuna delle altre chiamate di disegno modifica il valore dell'ID di istanza. Se l'ID dell'istanza supera i valori di 2²– 1, viene eseguito il wrapping su 0.

Esempio di

La figura seguente mostra come i valori di sistema sono associati a una striscia di triangoli instanziati nella fase Input Assembler (IA).

illustrazione dei valori di sistema per una striscia di triangoli istanziata

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.

Dati dei vertici C,U D,U E,U V,F 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 di strip di triangoli U ha tre primitive di triangolo, con i valori generati dal sistema seguenti:

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.

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

 

L'istanza di strip di triangoli V ha tre primitive di triangolo, con i valori generati dal sistema seguenti:

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 a strisce, che separa ogni istanza della striscia di triangoli.

Input-Assembler (IA) fase