Fase geometry shader

La fase geometry-shader (GS) esegue il codice shader specificato dall'applicazione con vertici come input e la possibilità di generare vertici nell'output.

The Geometry Shader

A differenza dei vertici shader, che operano su un singolo vertice, gli input del geometry shader sono i vertici di una primitiva completa (due vertici per le linee, tre vertici per triangoli o vertice singolo per punto). Gli shader geometry possono anche inserire i dati del vertice per le primitive adiacenti perimetrali come input (altri due vertici per una linea, altri tre per un triangolo). La figura seguente mostra un triangolo e una linea con vertici adiacenti.

illustrazione di un triangolo e di una linea con vertici adiacenti

Tipo
TV Vertice triangolo
AV Vertice adiacente
LV Vertice linea

 

La fase geometry-shader può utilizzare il valore generato dal sistema SV_PrimitiveID generato automaticamente dall'IA. Ciò consente di recuperare o calcolare i dati per primitivi se desiderati.

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

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

Quando un shader geometry è attivo, viene richiamato una volta per ogni primitiva passata o generata in precedenza nella pipeline. Ogni chiamata del geometry shader vede come input i dati per la primitiva richiamata, sia che si tratti di un singolo punto, di una singola riga o di un singolo triangolo. Una striscia di triangoli precedente nella pipeline comporta una chiamata del geometry shader 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 nella singola primitiva sono disponibili (ad esempio 3 vertici per triangolo), più i dati del vertice adiacenti se applicabili/disponibili.

Un shader geometry restituisce i dati un vertice alla volta aggiungendo vertici a un oggetto flusso di output. La topologia dei flussi è determinata da una dichiarazione fissa, scegliendo uno di: PointStream, LineStream o TriangleStream come output per la fase GS. Sono disponibili tre tipi di oggetti di flusso, PointStream, LineStream e TriangleStream, che sono tutti oggetti modelli. La topologia dell'output è determinata dal rispettivo tipo di oggetto, mentre il formato dei vertici aggiunti al flusso è determinato dal tipo di modello. 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 chiamata specificata di uno shader geometry sono indipendenti da altre chiamate (anche se l'ordinamento è rispettato). Un shader geometry che genera strisce di triangoli inizierà una nuova striscia su ogni chiamata.

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 stessi alla fase di shader successiva per l'input. Quando tale output di dati dal geometry shader ha significato per l'hardware su base primitiva (ad esempio SV_RenderTargetArrayIndex o SV_ViewportArrayIndex), anziché su base per vertice (ad esempio SV_ClipDistance[n] o SV_Position), i dati per primitivi vengono acquisiti dal vertice principale generato per la primitiva.

Le primitive parzialmente completate possono essere generate dal geometry shader se termina lo shader geometry e la primitiva è incompleta. Le primitive incomplete vengono rimosse in modo automatico. È simile al modo in cui l'IA tratta parzialmente le primitive completate.

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

Gli algoritmi che possono essere implementati nel geometry shader includono:

  • Espansione sprite punto
  • Sistemi di particella dinamica
  • Fur/Fin Generation
  • Generazione di volumi shadow
  • Single Pass Render-to-Cubemap
  • Per-Primitive scambio di materiale
  • Per-Primitive Configurazione materiale: inclusa la generazione di coordinate barycentriche come dati primitivi in modo che un pixel shader possa eseguire l'interpolazione degli attributi personalizzata (per un esempio di interpolazione normale in ordine superiore, vedere Esempio cubeMapGS).

Pipeline grafica

Fasi della pipeline (Direct3D 10)