Ombre nel rendering differito


12

Ho letto del materiale sul rendering posticipato e penso di averne un'idea. Ma quello che non capisco è come realizza le ombre. Il buffer G, per quanto ne so, non implica la creazione di una mappa ombra per ogni luce, quindi sono confuso sul modo in cui il passaggio di illuminazione è consapevole del fatto che ogni pixel sia occluso o meno. Dopotutto, un dato pixel che è visibile dalla prospettiva della fotocamera potrebbe non essere effettivamente visibile dalla prospettiva di una data luce e che la geometria occludente potrebbe non essere visibile dalla prospettiva della fotocamera e quindi non avere nulla scritto al riguardo nel G-buffer .

Se inizi a eseguire il rendering delle mappe d'ombra, allora sembra praticamente lo stesso del rendering in avanti: esegui il rendering di tutta la geometria nella scena per ogni luce per renderizzare le mappe d'ombra.

Quindi, in che modo il rendering differito realizza ombre equivalenti al rendering in avanti?

Risposte:


14

L'ombreggiatura differita non fa nulla di speciale per le ombre. È comunque necessario eseguire il rendering delle mappe d'ombra normalmente e quindi eseguire il rendering di ogni luce con la mappa d'ombra appropriata rilegata come trama.

È ancora meglio del rendering in avanti perché non è necessario ridisegnare la scena nella vista principale per applicare l'illuminazione. Disegnare la mappa delle ombre è spesso molto più economico del disegnare più passaggi nella vista principale perché non è necessario eseguire alcuna ombreggiatura dei pixel e le mappe delle ombre spesso contengono meno scena (è possibile eliminare molte più cose).

Le persone a volte fanno "ombre differite" per una luce, in genere la luce direzionale principale. Il motivo principale per fare ciò è utilizzare mappe d'ombra a cascata o un altro approccio che utilizza più mappe d'ombra per la stessa luce. Puoi riservare un canale nel G-buffer per una maschera d'ombra (bianco dove illuminato, buio dove ombreggiato) e applicare tutte le mappe d'ombra a cascata in questo canale G-buffer; quindi lo shader per la luce legge la maschera d'ombra e la moltiplica nel colore chiaro. Questo è bello poiché disaccoppia le ombre dall'ombreggiatura, ma stai ancora disegnando tutte le stesse mappe d'ombra.


1
Se sei estremamente intelligente, potresti provare a utilizzare uno shader di geometria durante la creazione di GBuffer per "incorporare" la creazione della mappa ombra (come nell'esempio DX10 della mappa cubo). Non sono sicuro che sia stato fatto, se è possibile o se alla fine sarebbe più lento - ma porterebbe la creazione di mappe d'ombra più vicine all'ombra differita, o nella definizione a seconda della religione.
Jonathan Dickinson,

6

Bene, cos'è una mappa ombra? Una mappa d'ombra è una trama a cui i texel rispondono a una semplice domanda: a quale distanza dalla luce, lungo la direzione rappresentata dal texel, è occlusa la luce? Le coordinate delle trame sono generate usando vari mezzi di tessitura proiettivi, a seconda del particolare algoritmo di mappatura dell'ombra.

La trama proiettiva è semplicemente un modo di trasformare un oggetto nello spazio della trama (e sì, lo so che suona all'indietro. Ma è così che funziona). Gli algoritmi di mappatura dell'ombra utilizzano diversi tipi di trasformazioni. Ma alla fine, queste sono solo trasformazioni da uno spazio all'altro.

Quando si esegue il rendering della mappa ombra, si prendono i vertici della geometria e li si trasforma in una pipeline di rendering standard. Ma le matrici di videocamera e proiezione sono progettate per la posizione e la direzione della luce, non per la posizione e l'orientamento della vista.

Quando si esegue il rendering in avanti con una mappa ombra, si esegue il rendering normale dell'oggetto, trasformando i vertici nello spazio della telecamera di visualizzazione e attraverso la matrice di proiezione di visualizzazione. Tuttavia, trasformi anche i vertici attraverso la tua videocamera luminosa e le matrici di proiezione, passandoli come dati per vertice allo shader di frammenti. Li usa attraverso la trama proiettiva per accedere alla trama dell'ombra.

Ecco il punto importante. L'accesso alla trama proiettiva è progettato in modo tale che la posizione a cui accede sulla trama rappresenta la direzione tra quel punto sulla superficie (il punto che si sta renderizzando nello shader di frammento) e la luce. Pertanto, recupera il texel che rappresenta la profondità alla quale si verifica l'occlusione per il frammento reso.

Ma non c'è niente di speciale in questa pipeline. Non è necessario trasformare le posizioni dei vertici nella trama dell'ombra e passarle allo shader di frammenti. Potresti passare le posizioni dei vertici dello spazio mondiale allo shader di frammenti, e poi far sì che lo shader di frammenti li trasformi nello spazio proiettivo della trama dell'ombra. Certo, avresti buttato via un sacco di prestazioni, dal momento che otterrai le stesse identiche coordinate di trama. Ma è matematicamente praticabile.

In effetti, è possibile passare le posizioni dei vertici della camera-spazio della vista allo shader del frammento. Potrebbe poi trasformarli in un mondo, quindi in uno spazio luminoso per la fotocamera, quindi in uno spazio proiettivo di ombreggiatura. Potresti mettere tutta quella trasformazione in una matrice (a seconda dell'algoritmo di proiezione ombra). Ancora una volta, questo ti dà esattamente quello che avevi prima, quindi quando si esegue il rendering in avanti, non c'è motivo di farlo.

Ma nel rendering posticipato , hai già le posizioni dei vertici della camera-spazio di visualizzazione. Devi, altrimenti non puoi fare l'illuminazione. O hai sprecato un sacco di memoria e larghezza di banda scrivendoli su un buffer, oppure eri intelligente e li hai ricalcolati usando il buffer di profondità e vari calcoli (che non entrerò qui, ma è coperto online).

In entrambi i casi, è possibile visualizzare le posizioni dello spazio della telecamera. E, come detto sopra, possiamo applicare una matrice per trasformarli dalla vista dello spazio della videocamera allo spazio di trama proiettiva dell'ombra. Quindi ... fallo. Quindi accedi alla tua mappa delle ombre.

Problema risolto.


È possibile escludere la geometria per luce nel rendering differito (per motivi di ottimizzazione)?
Samaursa,

@Samaursa: "Escludere la geometria per luce" da cosa? Dall'andare nella mappa delle ombre? Da accendersi?
Nicol Bolas,

Vedo che hai risposto alla domanda a riguardo, grazie. Per altri, se vogliono seguire la domanda / risposta: gamedev.stackexchange.com/q/178755/2287
Samaursa,
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.