Un buon esempio di effetto multi-pass?


9

In XNA (e Direct3D in generale AFAIK), piuttosto che creare shader di vertici e frammenti individuali, si raggruppano potenzialmente molti shader correlati in "Effetti". Quando si utilizza un effetto, si seleziona una "tecnica" (o si scorre attraverso tutte) e quindi ogni "tecnica" ha un numero di "passaggi". Passando attraverso ogni passaggio, seleziona il vertice e lo shader di frammenti pertinenti e disegna la geometria.

Ciò di cui sono curioso, però, è ciò per cui avresti bisogno di più pass? Capisco ai primi tempi di 3d che avevi solo una unità di trama e poi ne avevi 2 e che spesso non era ancora sufficiente se volevi anche fare la mappatura ambientale. Ma sui dispositivi moderni, anche nella classe mobile, puoi campionare 8 o più trame e fare tutti i calcoli di illuminazione che vorresti in un singolo shader.

I più esperti qui possono offrire esempi pratici di dove è ancora necessario il rendering multi-pass, o è solo un'ingegnerizzazione eccessiva da parte di XNA / Direct3d?

Risposte:


5

Ogni volta che stai facendo effetti post-process su un set di buffer catturati sarebbe un tempo ragionevole per usare un effetto multi-pass, cioè toon delineamento, motion blur, SSAO, bloom. L'idea era che il primo passaggio sarebbe dove avresti eseguito il rendering di tutto ai buffer appropriati e ogni passaggio successivo avrebbe gestito ogni effetto post-process.

Come menzionato da Ranieri sull'esempio di XNACC, stanno usando più passaggi per rendere un numero enorme di luci. Anche se in questo esempio, stanno eseguendo lo stesso passaggio, solo una volta per ogni luce.

Tieni presente che Shader Model 2 e precedenti non possono gestire quasi tutte le istruzioni di Shader Model 3 o 4 in ogni shader, un altro motivo per dividere un effetto in più passaggi - per supportare hardware precedente.


Puoi fare un esempio in cui un oggetto XNA Effect in cui esegui il loop attraverso EffectPasses ha più di un passaggio invece di usare effetti diversi e perché?
Jason Goemaat il

4

Come sottolineato nelle altre risposte, il rendering multi-pass (disegno di una singola mesh più volte con diversi shader / parametri), come suggerito in altre risposte, è sicuramente ancora usato, principalmente per l'illuminazione e gli effetti speciali

I passaggi D3DX Effect potrebbero essere utilizzati per questo tipo di cose. Ma potrebbe anche essere implementato con più di uno shader / effetto.

L'intenzione originale dei passaggi era di aiutare con l'implementazione di shader complessi su hardware di fascia bassa (pre-shader-2.0), dove le restrizioni sul numero di fasi di trama e le istruzioni di shader per passaggio erano piuttosto limitanti.

Nell'esempio dell'illuminazione multi-pass, si possono ottenere significativi miglioramenti delle prestazioni utilizzando i passaggi anziché gli effetti di commutazione?


3

Oltre alla cosa illuminante che tutti hanno menzionato, un altro uso importante di questo è la sfocatura . Orizzontale e verticale vengono eseguiti in passaggi separati (quindi per ottenere una sfocatura 9x9, è necessario campionare solo 18 pixel per ciascun pixel di output anziché 81). Questo è usato per fioritura / HDR, profondità di campo, bagliore, ecc


Forse, ma la maggior parte penso che le implementazioni di sfocatura utilizzino lo stesso shader per i passaggi orizzontali e verticali - e semplicemente passino negli offset di campionamento (come costanti dello shader o dati per vertice)?
bluescrn

1
@bluescrn - La fioritura è generalmente pensata come un effetto a 4 passaggi: uno per estrarre le aree luminose e il downscale, uno per sfocare in orizzontale, uno per sfocare in verticale, uno per combinare / migliorare l'immagine sfocata con l'originale. Mentre i parametri dello shader potrebbero essere usati per controllarli, sarebbe necessaria la ramificazione per differenziare tutto tranne i due passaggi di sfocatura
Robert Fraser,


1

Come ha detto Ranieri, puoi utilizzare più passaggi per più luci, ad esempio con un singolo materiale potresti avere un passaggio 'ambientale', un passaggio additivo per punto luce, un altro passaggio additivo per riflettore e quindi un passaggio decalcomania per moltiplicare il diffuso trama (ho usato una configurazione come questa in passato ed è il modo più flessibile di gestire uno shader di illuminazione che ho visto senza entrare in ombre differite).

Inoltre, credo che la maggior parte degli shader di pelliccia utilizzino più passaggi.


0

Le mappe ombra per la creazione di ombre possono essere eseguite utilizzando il multi-pass. Solo una nota, alcuni effetti multi-pass possono essere eseguiti in un solo passaggio se la scheda video supporta lo stesso numero di unità di trama del numero di passaggi. Quindi, se non hai abbastanza unità di trama, dovrai usare più passaggi. Una piattaforma hardware fissa (come le console di gioco), probabilmente puoi programmare semplicemente usando il multi-texturing perché conosci il numero di unità di trama. Ma per i PC, esiste un numero infinito di configurazioni hardware. Se vuoi avere la più ampia portata per i consumatori, probabilmente vorrai suddividere alcuni dei tuoi effetti più complessi in più passaggi in modo che gli utenti con hardware di livello inferiore (cioè non abbiano tante unità di trama sulla GPU) possano ancora vedi l'effetto. Brevemente, le mappe d'ombra vengono create creando prima una mappa d'ombra della scena dalla prospettiva della luce in un passaggio. Quindi la trama della mappa delle ombre viene mescolata alla scena con le altre trame della scena.

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.