A cosa servono gli shader Hull, Domain e Geometry?


21

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?


Penso che tu stia chiedendo la strada sbagliata - piuttosto che "a cosa servono" dovresti chiedere "cosa fanno" - se capisci le risorse date (e i loro concetti sottotitoli) solo il cielo è limitare ciò che sei effettivamente in grado di fare con loro.
Wondra,

@wondra: è quasi la stessa domanda, ma vorrei concentrarmi maggiormente su esempi di utilizzo pratico, piuttosto che sulla spiegazione teorica di ciò che fanno. In effetti, c'è una panoramica su MSDN che ho letto molte volte, ma ancora non riesco a capire cosa possono fare per me. Sono un essere intelligente, e posso collegare A e B, e capire da questo C, D, E ed F.
Panda Pajama,

Non so, "esempi di utilizzo pratico" mi sembrano un po 'ampi. Ci ho provato, ma prima di questo commento, quindi potrebbe essere troppo focalizzato su "cosa fanno" per il tuo.

@Josh: Usi o hai usato tutte queste fasi nel mondo reale?
Panda Pajama,

1
FYI per coloro che hanno un background non directx (come me), questi due sono chiamati "shader di controllo della tassellatura" e "shader di valutazione della tassellatura" in OpenGL e Vulkan.
Shahbaz,

Risposte:


13

Scafo e domini

Le fasi dello scafo e dello shader di dominio fanno parte della pipeline di tassellatura della GPU. Vengono generalmente utilizzati per calcolare geometrie di superficie altamente dettagliate basate sulla geometria di superficie di input di dettaglio inferiore, che è definita come triangoli o quadretti (eccetera). Le primitive di input con dettagli inferiori sono chiamate "patch", ed è importante notare che potrebbero non rappresentare la geometria effettiva che alla fine esisterà (anche se potrebbero). Pensa più ai punti di controllo di una curva più bezier, ad eccezione di una superficie.

Lo scafo shader prende una patch di input e produce una patch di output (o patch; questo è dove generalmente si verificherebbe la suddivisione della patch). I metadati costanti sulla patch possono anche essere calcolati all'interno dello shader dello scafo e possono essere elaborati da fasi successive della pipeline.

L'output dello scafo shader attraversa una fase di tassellatura (a funzione fissa) che produce domini piastrellati e normalizzati del tipo appropriato (ad es. Quad o triangoli).

Lo shader di dominio viene eseguito su questi domini al fine di calcolare l'effettiva posizione del vertice di un dato punto in un dominio risultante dalla suddetta tassellatura. Lo shader di dominio genera quindi una posizione di vertice.

La fase di tassellatura si verifica dopo lo stadio shader di vertice nella pipeline.

Geometry Shaders

Gli shader Geometry sono come shader semplificati di scafo / dominio, in un certo senso. Prendono semplicemente i vertici di input e producono i vertici di output. Per un dato vertice di input, è possibile produrre molti vertici di output, quindi possono essere utilizzati per "generare geometria".

Lo stadio shader della geometria si verifica dopo lo shader di vertice e dopo lo stadio di tassellatura.

usi

Lo shader della geometria può scrivere in streaming ai buffer di output invece di essere immesso direttamente nella fase di rasterizzazione e frammentazione dell'ombreggiatura della pipeline; questo significa effettivamente che è possibile rieseguire la geometria prodotta da una combinazione di una iterazione di shader vertice / scafo / dominio / geometria attraverso la pipeline, per eseguire ulteriori lavori in un altro stadio shader di vertice o altro.

Quello a cui puoi usare questi è un argomento piuttosto ampio, efficacemente illimitato, quindi non cercherò davvero di affrontarlo. Ma per quanto riguarda alcuni motivi motivanti da prendere in considerazione per usarli ... La cosa grandiosa di queste fasi dello shader è che ti permettono di ottenere potenzialmente un sacco di dettagli extra senza pagare il costo della memoria o della larghezza di banda per tutto questo, sempre. E anche per spostare l'elaborazione dalla CPU alla GPU.

Il terreno è un buon esempio di dove potresti voler usare parte di questa tecnologia, poiché in genere devi vederlo sia molto vicino (poiché il tuo personaggio è in piedi su di esso) sia molto lontano (le montagne in lontananza) e potendo controllare dove e quanti dettagli metti al volo la geometria del terreno "al volo" tramite queste fasi dello shader è molto potente. Le alternative sono state storicamente pagando un costo medio costante per il terreno in ogni momento (un approccio con il minimo comune denominatore) o pagando manualmente blocchi di geometria per diversi livelli di dettaglio dentro e fuori dalla memoria GPU, che è noioso e costoso.

Qualsiasi situazione simile in cui potresti avere una vasta gamma di livelli di dettaglio che devi supportare per alcune mesh o modelli ragionevolmente suddivisibili può essere un candidato per fare qualcosa di intelligente anche con questi shader. Tuttavia, non tutto si traduce bene nell'ottimizzazione dello stile della superficie di suddivisione . Probabilmente potresti usarli anche per vestiti e capelli.

Per ulteriori letture, tra cui molti più dettagli di quelli che posso ragionevolmente ricordare o andare qui:


4
Tieni presente che gli shader di scafo e dominio richiedono hardware Direct3D Feature Level 11.0 o successivo e che gli shader di geometria richiedono hardware Direct3D Level 10.0 o successivo. Inoltre, la maggior parte dei progetti di schede video offre allo stage shader della geometria pochissimo o nessun hardware dedicato, quindi la loro utilità nella pratica è molto inferiore a quanto inizialmente previsto.
Chuck Walbourn,

@ChuckWalbourn: Mi piacerebbe davvero saperne di più, se lo desideri, in una risposta separata
Panda Pajama,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.