Ho fatto la mia giusta parte della programmazione di giochi 3D per il mio (ex) datore di lavoro, e anche nei miei motori personalizzati per i miei giochi indipendenti.
Inizialmente, ho iniziato con Direct3D 9 e D3DX9, che praticamente ha fatto tutto per me e non mi ha richiesto di pensare in termini di shader.
Successivamente, ho scritto i miei primi shader Direct3D 9, ma per lo più ho usato uno shader molto semplice per tutto ciò che ho fatto.
Nell'ultima iterazione del mio motore di gioco, sono passato a Direct3D 11 e con ciò ho creato molti shader. Ho fatto lo skinning della GPU, le particelle calcolate sulla GPU, molti effetti di illuminazione e post elaborazione, tutto nella GPU. Roba davvero fantastica.
Finora ho usato solo shader di vertici e pixel / frammenti. Anche se ci sono ancora molte cose che non ho ancora fatto, credo di avere una solida conoscenza di ciò che fanno gli shader di vertici e pixel / frammenti e di come tutto ciò si adatta all'intera pipeline 3D.
Al passo con gli sviluppi più recenti, sono diventato molto interessato alle nuove fasi dello shader. Cioè, Geometry Shader, e ancora più recente, gli shader Hull e Domain.
Non ho mai usato queste fasi, ma da quello che so, Geometry shader, se abilitato, viene eseguito dopo il vertice shader, una volta per ogni vertice trasformato (o una volta per primitiva?) E ti consente di scartare vertici (e primitivi?) e crearne di nuovi (che immagino risalire all'inizio della pipeline?).
La mia ipotesi è che l'uso principale dello shader della geometria sarebbe di generare programmaticamente la geometria nella GPU. Un uso comune sarebbe quello di creare quadratini di affissioni basati su un singolo vertice, ma in realtà non visualizzo molti altri scenari comuni oltre a generare frattali e altre cose che puoi generare al 100% in modo programmatico.
Per quanto riguarda gli shader Hull e Domain, sembra che siano correlati alla tassellatura (creazione di superfici più lisce da superfici ruvide?), E devono essere usati insieme o per niente. Anche il termine "patch" sembra essere comune qui.
Qualcuno vorrebbe spiegarmi, in termini pratici, a cosa servono queste nuove fasi di shader, come si adattano alla pipeline 3D e in quali casi dovrei considerare di usarle?