Volumi di propagazione della luce: filtro anisotropico dei dati di volume


9

Ho implementato l'algoritmo Cascaded Light Propagation Volumes (ancora senza ombre indirette) per l'illuminazione globale diffusa in tempo reale, dettagliata qui e qui . Funziona bene ma sto ancora cercando di correggere un artefatto in particolare.

Breve riassunto

Puoi saltare questo se sai già come funziona l'algoritmo.

L'algoritmo funziona memorizzando le informazioni di illuminazione sotto forma di armoniche sferiche in una griglia 3D, dove inizialmente i dati in ciascuna cella della griglia provengono dal rendering di una mappa d'ombra estesa ( mappa d'ombra riflettente) che include anche il colore e le informazioni normali, oltre alla profondità. L'idea è che essenzialmente tutti i pixel visti da una sorgente luminosa sono la causa del primo rimbalzo dell'illuminazione indiretta, quindi memorizzi le informazioni richieste insieme al normale buffer di profondità che usi per la mappatura dell'ombra e campiona tutti i dati per inizializzare la griglia 3D . Le informazioni nella griglia 3D vengono quindi propagate in modo iterativo (per ogni iterazione) propagando le informazioni in una cella a tutti i suoi 6 vicini diretti (sopra, sotto, a sinistra, a destra, in alto, in basso). Per illuminare la scena usando le informazioni nella griglia, applichi un passaggio a schermo intero sulla scena e per ogni pixel rasterizzato hai a disposizione la posizione dello spazio mondiale della superficie rasterizzata (ad es. Da G-Buffer con ombreggiatura differita), quindi sapere a quale cella della griglia appartiene un determinato pixel sullo schermo.

Questo sta funzionando bene per la maggior parte, qui ci sono due immagini senza IG simulato e solo un termine ambientale hardcoded, e accanto ad essa un'immagine con l'algoritmo LPV. Osserva i riflessi colorati sulle superfici, i migliori dettagli di profondità, ecc.

inserisci qui la descrizione dell'immagine

Problema

Quando si guardano le celle durante la fase di illuminazione, l'interpolazione trilineare (utilizzando i filtri delle trame hardware) viene utilizzata per interpolare uniformemente i dati tra il centro di una cella, le sue celle vicine e la coordinata delle trame cercate. In sostanza, questa interpolazione imita la propagazione delle informazioni di illuminazione al centro di una cella ai pixel concreti intorno al centro in cui vengono cercate le informazioni. Ciò è necessario perché altrimenti l'illuminazione sembrerebbe molto brutta e brutta. Tuttavia, poiché l'interpolazione trilineare non tiene conto della direzione della propagazione della luce delle informazioni di illuminazione codificate in una cella (ricordate, è in armoniche sferiche), la luce può essere propagata in modo errato al pixel cercato. Ad esempio, se la radianza codificata nella cella si propaga solo verso (1,0,0) ("

Ciò causa un sanguinamento della luce errato attraverso le pareti quando le dimensioni delle celle nella griglia sono grandi rispetto alle superfici della scena (questo è necessario perché sono necessarie celle grandi per propagare la luce lontano nella scena con il minor numero di iterazioni di propagazione possibile). Ecco come appare:

inserisci qui la descrizione dell'immagine

Come puoi vedere (dai contorni dell'ombra in alto a destra), la scena è illuminata da una fonte di luce direzionale da qualche parte sopra la scena in alto a sinistra. E poiché esiste solo una cellula che separa l'esterno dell'atrio e l'interno, la luce penetra e la parete a sinistra viene illuminata in modo errato.

Domanda reale

L'autore suggerisce una forma di filtro anisotropico manuale per risolvere questo problema. Fornisce un gradiente di luminosità (suppongo che i coefficienti SH campionati dalla cella corrente) verso la direzione della superficie normale n siano:

inserisci qui la descrizione dell'immagine

E afferma

Pertanto, confrontando la derivata direzionale della radianza con la direzione della radianza effettiva, si può calcolare se la distribuzione della radianza inizia oltre la sua interpolazione trilineare per questo punto.

Le mie domande):

Nell'equazione, la funzione c (x) sembra essere il coefficiente SH nel punto (x). Quindi il gradiente di radianza sembra essere calcolato come un normale derivato numerico come la differenza ponderata dei coefficienti SH nei punti x - (n / 2) e x + (n / 2). Tuttavia, che cos'è c (x) nel mio contesto? Attualmente presumo che c (x) si riferisca ai coefficienti interpolati trilineamente nella posizione della superficie (x), ma non ne sono affatto sicuro, dal momento che non so come si supponga che ti dia maggiori informazioni sul direzionale distribuzione dei coefficienti SH.

E come viene quindi utilizzato quel gradiente per cambiare esattamente come l'illuminazione campionata dalla cella viene applicata alle superfici, esattamente? L'autore scrive semplicemente "confrontando la derivata direzionale della radianza con la direzione della radianza reale", ma questo è piuttosto vago.

Egli menziona l'uso di uno "schema di differenziazione centrale" e fa riferimento a queste diapositive per la differenziazione centrale dei coefficienti SH, e fa anche riferimento a questo documento che mostra le derivazioni del gradiente, ma in questo momento non posso trarre alcuna conclusione utile da esse.

Risposte:


4

La differenza centrale è stata introdotta da un documento AMD quando hanno fatto qualche demo con il cristallo che vola in un tunel, dalla memoria.

La cfunzione non deve essere qualcosa di preciso, solo un'idea, ad esempio, di luminosità, quindi valuta l'SH usando la tua normale corrente.

Quindi quello che fai con questo, è che tu abbassi tono, usando un fattore empirico, la radiosità usando questo differenziale. Ma riduci solo se il differenziale implica che il flusso luminoso si allontana dalla tua normale corrente.

Fondamentalmente l'idea è di rilevare empiricamente il fatto che se vai nella direzione opposta alla normale del tuo muro, il flusso di luce sta diminuendo lentamente, perché si propaga nell'aria (dall'altra parte). Ma se sondi un po 'di fronte al tuo normale, noterai un improvviso calo di flusso, significa che la cella che stai campionando ora è in realtà una perdita.

Ho scoperto che funziona nel 70% dei casi, ma se applicato con noncuranza, può creare effetti di buchi neri molto strani o cambiamenti di tonalità (rosa, verde ...) su aree molto scure che contengono una perdita di luce di altro genere. Questo perché hai 3 LPV per ogni colore, la differenza centrale tende a dare risultati diversi. Se sei in grado, prova a utilizzare la luminosità della scala di grigi per valutare lo smorzatore della differenza centrale e utilizza un fattore di riduzione comune a tutti i canali di colore in un secondo momento.

Senza questo hack, normalmente non dovresti comunque ottenere molta luminosità, perché il normale che usi per valutare l'SH si oppone alla direzione del flusso. Tuttavia, come si nota, gli SH a 2 bande utilizzati in LPV non sono abbastanza, infatti, e hanno un forte componente DC che fornisce queste potenti perdite. Questo è il motivo per cui LPV non è pratico per le geometrie che non sono strettamente controllate da un artista consapevole di LPV, che conferirà ad ogni parete uno spessore minimo per ridurre le perdite.

Inoltre alcune aziende (come Square Enix) utilizzano pareti bloccanti progettate manualmente per eliminare le perdite, come il volume della geometria dovrebbe darti. (il volume della geometria aiuta a ridurre le perdite, ma la retroproiezione RSM per voxelizzare la scena nella maggior parte dei casi è troppo parziale e crea aliasing a livello di cella LPV che conferisce alle perdite un aspetto ancora peggiore perché variano di intensità in modo strano).

Puoi solo succhiarlo e provare a mitigare i problemi dando a LPV una parola finale meno forte sulla luce indiretta finale, usare un termine costante con un peso (0,5?) E il LPV potrebbe contribuire al rimanente 0,5 del indiretto leggero. Prova anche a implementare il volume della geometria, diminuirà il problema. E infine la differenza centrale.


come miglioramento di oltre il 50% di ambiente costante, è possibile utilizzare una tecnica chiamata "ambient BRDF" (con tri-Ace).
v.
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.