Condividi tramite


Uso dei valori di System-Generated

I valori generati dal sistema sono generati dalla fase IA (in base all'input fornito dall'utente semantica) per garantire una maggiore efficienza nelle operazioni degli shader.

Collegando dati, ad esempio un ID istanza (visibile a VISUAL Studio), un ID vertice (visibile a Visual Studio) 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 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 primitivo 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 IA. Collegare la semantica vertex-id alla dichiarazione di input dello shader per informare la fase IA di generare un ID per ogni 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. Per ID3D11DeviceContext::DrawIndexed e ID3D11DeviceContext::DrawIndexedInstanced, l'ID vertice rappresenta il valore di indice. Se l'ID del vertice inizia un overflow (supera 2³²– 1), ritorna 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 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 di primitiva a ogni primitiva per l'uso da parte del "geometry shader" o della fase del "pixel shader" (a seconda di 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 i valori 2²- 1, viene eseguito il wrapping su 0.

La fase pixel shader non ha un input separato per un ID primitivo; tuttavia, qualsiasi input di 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 ID istanza viene usato da ogni fase dello shader per identificare l'istanza della geometria in fase di elaborazione. È 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 di 1. Tutte le altre chiamate di disegno non modificano il valore dell'ID istanza. Se l'ID istanza supera 2³²–1, viene reimpostato a 0.

Esempio

La figura seguente mostra come i valori di sistema vengono associati a una striscia di triangoli a istanza nella fase 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

 

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 del vertice 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 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 fase