Condividi tramite


Fase geometry shader

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

The Geometry Shader

A differenza dei vertex shader, che operano su un singolo vertice, gli input dello shader geometry sono i vertici di una primitiva completa (due vertici per le linee, tre vertici per i triangoli o un singolo vertice per il punto). Gli shader geometry possono anche inserire i dati dei vertici per le primitive adiacenti ai bordi 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

Digitare
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. In questo modo, i dati per primitivi possono essere recuperati o calcolati, se necessario.

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 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 geometry shader possono essere arbitrarie e le nuove strip possono essere create tramite la funzione RestartStrip HLSL.

L'output dello shader geometry 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).

Quando un geometry shader è 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 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 dei vertici adiacenti, se applicabili/disponibili.

Un geometry shader restituisce 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 flusso, PointStream, LineStream e TriangleStream, 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. 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.

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 successiva dello shader per l'input. Quando tale output di dati dal geometry shader ha un significato per l'hardware per ogni primitiva (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 dal geometry shader se termina lo shader geometry 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 geometry 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 nello shader geometry includono:

  • Espansione sprite punto
  • Sistemi di particelle dinamiche
  • Fur/Fin Generation
  • Generazione di volumi shadow
  • Mappa da rendering a cubo a passaggio singolo
  • Per-Primitive scambio materiale
  • Per-Primitive configurazione del materiale: inclusa la generazione di coordinate barycentriche come dati primitivi in modo che un pixel shader possa eseguire l'interpolazione di attributi personalizzata (per un esempio di interpolazione normale di ordine superiore, vedere esempio CubeMapGS).

pipeline grafica

fasi della pipeline (Direct3D 10)