Che cos'è il rendering differito?


54

Ho sentito parlare del rendering differito e di come utilizzarlo può consentire "un sacco" di luci in una scena senza un enorme impatto sulle prestazioni, ma che cos'è e (da un livello elevato) come viene implementato?

Risposte:


55

La caratteristica distintiva del rendering differito è che essenzialmente cambia la complessità del rendering della scena da O (geometria * luci) a O (geometria + luci).

Ciò si ottiene eseguendo prima il rendering della scena utilizzando shader progettati per produrre attributi di base come (al minimo) posizione *, colore normale e diffuso. Altri attributi potrebbero includere valori speculari per pixel e altre proprietà del materiale. Questi sono memorizzati in target di rendering a schermo intero, noti collettivamente come G-buffer.

(*: Vale la pena notare che gli sviluppatori opteranno più comunemente per memorizzare la profondità e utilizzarla per ricostruire la posizione, poiché avere la profondità disponibile è utile per molti altri effetti. )

Una volta generato il buffer G, è possibile calcolare un risultato completamente illuminato per qualsiasi pixel sullo schermo risolvendo il BRDF esattamente una volta per pixel per luce. In altre parole, se hai 20 mesh che sono influenzate da 20 luci ciascuna, il rendering tradizionale ("in avanti") richiederebbe di ripetere il rendering di ogni mesh più volte al fine di accumulare il risultato di ciascuna luce che la colpisce. Nel peggiore dei casi, si tratterebbe di un richiamo per mesh per luce o di 400 richiami totali! Per ognuna di queste chiamate di disegno, stai ridondando in modo ridondante i vertici della mesh. C'è anche una buona probabilità che ombreggi i pixel che non sono effettivamente interessati dalla luce o che non saranno visibili nel risultato finale (perché saranno occlusi da altre geometrie nella scena). Ognuno di questi risultati in risorse GPU sprecate.

Confronta con il rendering differito: per popolare il buffer G devi solo eseguire il rendering delle mesh una volta. Successivamente, per ogni luce, rendi una forma delimitante che rappresenta l'estensione della influenza della luce. Per un punto luce, questa potrebbe essere una piccola sfera, o per una luce direzionale, sarebbe un quad a schermo intero, poiché l'intera scena è interessata.

Quindi, quando esegui lo shader pixel / frammento per il volume di delimitazione di quella luce, leggi gli attributi della geometria dalla posizione appropriata nelle trame del G-buffer e usi questi valori per determinare il risultato di illuminazione. Solo i pixel della scena che sono visibili nel risultato finale sono ombreggiati e sono ombreggiati esattamente una volta per luce. Ciò rappresenta un risparmio potenzialmente enorme.

Tuttavia, non è privo di inconvenienti. È un paradigma che è molto difficile estendere per gestire la geometria trasparente (vedi: peeling di profondità). In effetti, è così difficile che praticamente tutte le implementazioni di rendering differite ricadono sul rendering in avanti per le parti trasparenti della scena. Il rendering differito consuma anche una grande quantità di VRAM e larghezza di banda del buffer dei frame, il che porta gli sviluppatori a fare di tutto per impacchettare e comprimere abilmente gli attributi del buffer G nei componenti più piccoli / più piccoli possibili.


8

Definito anche Ombreggiatura differita, Rendering differito si riferisce a una vasta gamma di possibili percorsi di rendering che memorizzano i risultati intermedi in trame, quindi completano l'equazione di rendering in seguito campionando i dati intermedi.

I buffer di geometria sono un primo esempio, in cui la scena viene trasformata in una serie di buffer che contengono, ad esempio, la posizione, la struttura normale e la base della geometria opaca. L'illuminazione non è stata applicata e il colore finale non è noto. Nei passaggi successivi vengono visualizzate le luci e vengono campionati i buffer di geometria. Ciò significa che è possibile eseguire il rendering di un gran numero di luci con un costo fisso del numero di luci eventualmente visibili su un pixel dello schermo. Il rendering tradizionale avrebbe valutato tutte le sorgenti luminose per le superfici che erano state occluse e mai viste sullo schermo.

Esistono molte varianti, incluso ad esempio il rendering di informazioni sulla luce.

Per ulteriori informazioni: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading


-3

Il rendering differito è l'elaborazione in cui si trova la geomtry prima di eseguire un secondo passaggio per ombreggiare tutto. È utile perché cambia la coplexity in O (pixel * sorgenti luminose), permettendoti di utilizzare scene complesse con solo un piccolo impatto sulle prestazioni.

L'implementazione è piuttosto semplice. Il primo passaggio richiede il rendering, come minimo, di distanza, normale e colore. È possibile aggiungere più trame per renderizzare come speculare e posizionare, a costo della memoria.

Dopo averli renderizzati, renderizzi alcune sfere, in cui una sorgente luminosa unica è al centro di ognuna, aggiungi la luce insieme, ritaglia tutta la geometria nella tua scena e infine applica il decadimento.


Non credo che ciò aggiunga qualcosa di nuovo alle risposte. Sembra solo una parte riformulata della risposta di Neverender.
HolyBlackCat

@HolyBlackCat Ci sono un paio di differenze importanti. Prima di tutto c'è l'equazione della complessità corretta, e in secondo luogo, è molto più concisa, mentre spiega ancora come implementarla effettivamente.
hellol11,

there's the correct complexity equationVero. Ma direi che è un dettaglio minore. Puoi suggerirlo come modifica all'altra risposta o lasciare un commento al riguardo una volta che hai abbastanza reputazione. Fare una nuova risposta per questo è un po 'eccessivo. it's much more concisePersonalmente non penso sia buono. Più dettagli utili ha una risposta, migliore è, no?
HolyBlackCat

1
@HolyBlackCat A un certo punto, sì. Personalmente, non mi piace dover passare attraverso un muro di testo solo per avere una semplice risposta.
hellol11,
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.