Fase geometry shader
La fase geometry shader (GS) esegue il codice shader specificato dall'applicazione con vertici come input e può 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 (ovvero due vertici per le linee, tre vertici per i triangoli o un singolo vertice per un punto) più i dati dei vertici per le primitive adiacenti del bordo (ovvero due vertici aggiuntivi per una linea o altri tre vertici per un triangolo). La figura seguente mostra esempi di primitive che vengono immesse in un geometry shader.
Un altro input per il geometry shader è un ID primitivo generato automaticamente dall'assembler di input (IA). Un ID primitivo consente al geometry shader di recuperare o calcolare, se necessario, i dati per viso.
La fase geometry shader può restituire più vertici per formare una singola topologia selezionata. Le topologie di output GS disponibili sono tristrip, linestrip e pointlist. Il numero di primitive che un geometry shader genera può variare, anche se il numero massimo di vertici che un geometry shader può generare deve essere dichiarato in modo statico. Le lunghezze di strip che un geometry shader genera possono essere arbitrarie (è presente un comando cut ).
L'output del geometry shader può essere inviato al rasterizzatore e a un vertex buffer in memoria. L'output inviato alla memoria viene espanso a singoli elenchi di punti, linee e triangoli (analogamente alla modalità di passaggio dell'output al rasterizzatore).
La fase geometry shader può implementare gli algoritmi seguenti:
Tessellation Point Sprite: lo shader accetta un singolo vertice e genera quattro vertici (due triangoli di output) che rappresentano i quattro angoli di un quad con texcoord arbitrari, normali e altri attributi.
Mosaico linea wide: lo shader riceve due vertici di riga (LV0 e LV1) e genera quattro vertici per un quad che rappresenta una linea più ampia. Inoltre, uno shader geometry può usare i vertici di linea adiacenti (AV0 e AV1) per eseguire l'acaro sugli endpoint di linea.
Fur/Fin Generation: rendering di più offset potenzialmente con trame diverse (facce estruse) per simulare gli effetti parallatici della pelliccia. Le pinne sono bordi estrusi che spesso si dissolve se l'angolo non è obliquo. Le pinne vengono usate per migliorare l'aspetto degli oggetti sugli angoli obliqui.
Generazione del volume shadow: informazioni sull'adiacenza usate per determinare se estrudere.
Rendering con passaggio singolo a più visi del cubo trama: le primitive vengono proiettate e generate in un pixel shader sei volte. Ogni primitiva è accompagnata da un indice di matrice di destinazione di rendering, che seleziona una faccia del cubo.
Configurare le coordinate barycentriche come dati primitivi in modo che il pixel shader possa eseguire l'interpolazione di attributi personalizzata.
Caso patologico: un'applicazione genera una geometria, quindi n-patch tale geometria e quindi estruisce i volumi di ombreggiatura fuori da tale geometria. Per questi casi, il multi-pass è la soluzione con la possibilità di restituire i dati dei vertici e primitivi in un flusso e di circolare nuovamente i dati.
Poiché ogni chiamata al geometry shader può produrre un numero variabile di output, le chiamate parallele all'hardware sono più difficili in questa fase rispetto all'esecuzione di altre fasi della pipeline (ad esempio le fasi del vertice o del pixel shader) in parallelo. Sebbene le implementazioni hardware eseguano chiamate geometry shader in parallelo, il buffering complesso necessario per eseguire chiamate di geometry shader parallele significa che le applicazioni non devono richiedere il livello di parallelismo ottenibile nella fase geometry shader per essere altrettanto altre fasi della pipeline. In altre parole, lo shader geometry potrebbe diventare un collo di bottiglia nella pipeline a seconda del carico del programma di cui dispone il geometry shader. Tuttavia, l'obiettivo è che gli algoritmi che usano la funzionalità del geometry shader continueranno a essere eseguiti in modo più efficiente rispetto all'applicazione che deve emulare il comportamento sull'hardware che non è in grado di generare geometria a livello di codice.
Il runtime Direct3D chiama le funzioni driver seguenti per creare, configurare ed eliminare definitivamente lo shader geometry: