Condividi tramite


Fase geometry shader (GS)

La fase Geometry Shader (GS) elabora intere primitive: triangoli, linee e punti, insieme ai vertici adiacenti. È utile per gli algoritmi, tra cui Point Sprite Expansion, Dynamic Particle Systems, e Shadow Volume Generation. Supporta l'amplificazione della geometria e la de-amplificazione.

Scopo e usi

La fase Geometry Shader elabora intere primitive: triangoli (3 vertici con un massimo di 3 vertici adiacenti), linee (2 vertici con fino a 2 vertici adiacenti) e punti (1 vertice).

illustrazione di un triangolo e di una linea con vertici adiacenti

Geometry Shader supporta anche l'amplificazione e la de amplificazione della geometria limitate. Data una primitiva di input, geometry shader può eliminare la primitiva o generare una o più nuove primitive.

La fase Geometry Shader (GS) è una fase di-shader programmabile; viene visualizzata come blocco arrotondato nel diagramma della pipeline grafica. Questa fase dello shader espone la propria funzionalità univoca, basata sui modelli di shader (si veda core common-shader).

La fase Geometry Shader è ideale per gli algoritmi, tra cui:

  • Point Sprite Expansion
  • Dynamic Particle Systems
  • Fur/Fin Generation
  • Shadow Volume Generation
  • Single Pass Render-to-Cubemap
  • Per-Primitive Material Swapping
  • Per-Primitive Material Setup: questa funzionalità include la generazione di coordinate baricentriche come dati primitivi in modo che un pixel shader possa eseguire l'interpolazione di attributi personalizzata.

Input

La fase Geometry Shader esegue il codice shader specificato dall'applicazione con intere primitive come input e la possibilità di generare vertici nell'output. A differenza dei vertex shader, che operano su un singolo vertice, gli input del geometry shader sono i vertici di una primitiva completa (tre vertici per triangoli, due vertici per le linee o un singolo vertice per il punto). Gli shader geometrici possono anche inserire i dati dei vertici per le primitive adiacenti ai bordi come input (altri tre per un triangolo, altri due vertici per una linea).

La fase Geometry Shader può utilizzare il valore generato dal sistema SV_PrimitiveID generato automaticamente dalla fase Input Assembler (IA). In questo modo, i dati per primitivi possono essere recuperati o calcolati, se necessario.

Quando uno shader geometrico è attivo, viene richiamato una volta per ogni primitiva passata o generata in precedenza nella pipeline. Ogni chiamata dello shader geometry vede come input i dati per la primitiva chiamante, indipendentemente dal fatto che si tratti di un singolo punto, di una singola riga o di un singolo triangolo. Una striscia di triangoli precedente nella pipeline genera una chiamata dello shader geometrico per ogni singolo triangolo nella striscia (come se la striscia fosse espansa in un elenco di triangoli). Tutti i dati di input per ogni vertice della singola primitiva sono disponibili (ovvero 3 vertici per un triangolo), più i dati dei vertici adiacenti, se applicabili e disponibili.

Abbreviazioni dei vertici comuni:

Abbreviazione Termine
TV Vertice triangolo
LV Vertice linea
AV Vertice adiacente

 

Output

La fase Geometry Shader (GS) è in grado di generare più vertici che formano una singola topologia selezionata. Le topologie di output del geometry shader a disposizione sono tristrip, linestrip e pointlist. Il numero di primitive generate può variare liberamente all'interno di qualsiasi chiamata del geometry shader, anche se il numero massimo di vertici che possono essere generati deve essere dichiarato in modo statico. Le lunghezze di strip generate da una chiamata di geometry shader possono essere arbitrarie e le nuove strip possono essere create tramite la funzione HLSL RestartStrip.

L'esecuzione di un'istanza geometry shader è atomica da altre chiamate, ad eccezione del fatto che i dati aggiunti ai flussi sono seriali. Gli output di una determinata chiamata di un geometry shader sono indipendenti da altre chiamate (anche se l'ordinamento viene rispettato). Un geometry shader che genera strisce di triangoli avvierà una nuova striscia su ogni chiamata.

L'output dello shader geometrico può essere alimentato alla fase di rasterizzazione e/o a un buffer dei vertici in memoria tramite la fase di output del flusso. L'output immesso in memoria viene espanso in singoli elenchi di punti/linee/triangoli (esattamente come verrebbero passati al rasterizzatore).

Uno shader geometrico restituisce dati un vertice alla volta aggiungendo vertici a un oggetto flusso di output. La topologia dei flussi è determinata da una dichiarazione fissa, scegliendo un oggetto TriangleStream, LineStream e PointStream come output per la fase GS.

Sono disponibili tre tipi di oggetti flusso: TriangleStream, LineStream e PointStream, che sono tutti oggetti modello. La topologia dell'output è determinata dal rispettivo tipo di oggetto, mentre il formato dei vertici accodati al flusso è determinato dal tipo di modello.

Quando un output geometry shader viene identificato come valore interpretato dal sistema (ad esempio, SV_RenderTargetArrayIndex o SV_Position), l'hardware esamina questi dati ed esegue un comportamento dipendente dal valore, oltre a poter passare i dati alla fase successiva dello shader per l'input. Quando tali dati emessi dallo shader geometrico hanno un significato per l'hardware su base individuale (ad esempio SV_RenderTargetArrayIndex o SV_ViewportArrayIndex), anziché su base per vertice (ad esempio SV_ClipDistance[n] o SV_Position), i dati per primitiva vengono acquisiti dal vertice iniziale generato per la primitiva.

Le primitive parzialmente completate possono essere generate dallo shader geometrico, se quest'ultimo ha termine e la primitiva è incompleta. Le primitive incomplete vengono eliminate automaticamente. Questo è simile al modo in cui l'IA gestisce le primitive parzialmente completate.

Lo shader geometrico può eseguire operazioni di campionamento di carico e trama in cui i derivati dello spazio dello schermo non sono necessari (samplelevel, samplecmplevelzero, samplegrad).

Pipeline grafica