Geometry Shader e Stream Output
Da: "The Direct3D 10 System" di David Blythe
Ultimo ma non per importanza, parliamo delle nuovissime componenti del core: i Geometry Shader (GS). Iniziamo il viaggio tra gli step logici nel processo di rendering (questo potrebbe essere una funzione fissa o threaded attraverso un core frammentato). Il termine "pipeline" è pura tassonomia; ogni stadio è una parte del processo, ma potrebbe accadere che allo stesso tempo in un'altra parte dello stesso frame si stia lavorando su qualcos'altro. Tuttavia il primo posto in cui passa il dato è l'Input Assembler (IA).
Come potete vedere dal diagramma qui sotto, l'IA colleziona un vertex data a una sola dimensione. Ogni (fino a) otto input stream ha un dato vertex specifico che contiene fino a 16 campi strutturali chiamati elementi. Ogni elemento è un multiplo da uno a quattro data item. Guardando ancora il diagramma sopra, potrete vedere il vertex data input come 16x3x32b (esempio, float32).
Tradizionalmente i vertex data sono letti in sequenza dal vertex buffer, ma può essere specificato un index buffer. Questo fornisce ottimizzazioni prestazionali ulteriori, come la ricompilazione dei risultati per lo stesso index, che può essere evitata. Ogni pezzo è etichettato e lavora separatamente, e poi viene messo insieme in accordo all'indirizzo index assegnato.
L'IA può inoltre replicare gli oggetti; ci siamo riferiti a questo aspetto come instancing. Allo stesso tempo, ogni dato primitivo è "etichettato" con l'istanza corrente, primitiva e vertex ID. Ogni oggetto ora ha un index ID che può essere utilizzato negli stadi superiori. Questo significa che, ad esempio, un carro armato nel vostro battle game può divertarne 100, ognuno con la sua proprietà e ID. Qui, una chiamata draw può amministrare centinaia di oggetti, laddove una volta doveva essere effettuata una chiamata per ognuno.
Da: "The Direct3D 10 System" di David Blythe
Dai VS, i dati si spostano in una parte del processo, il Geometry Shader e Stream Output (SO). Il GS prende tutti i vertici (punti, linee e triangoli) e lì può aggiungerli ai vertex. Di fatto, i GS possono ingrandire il numero di input delle primitive attraverso la produzione di primitive aggiuntive: fino a un valore di 1024 - 32-bit di vertex data. Questa è la parte più potente del core, in quanto i GS possono inoltre aggiungere più attributi ai dati vertex - o distruggerli.
Il Geometry Shader è così potente perchè non è solo uno shader che può scrivere nella memoria, attraverso lo Stream Output. Questo copia inoltre un multi-element (fino a 16 elementi) o fino a quattro singoli elementi output streams verso gli output buffers. Questi dati possono essere letti durante il processo da ogni parte del processo, e quindi i dati potrebbero fermare l'arrivo di IA e Vertex Shader. Le scene possono essere prolungate attraverso la manipolazione degli output data.
Da: "The Direct3D 10 System" di David Blythe
Il resto del processo ci è familiare. I dati viaggiano in uno stadio di configurazione, dove vengono effettuate operazioni di rasterizzazione e Z-culling. I pixel shaders poi prendono i dati e creano la scena, aggiungendo luci e altri tecniche per far sembrare il gioco ancora più bello.