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.
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:
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:
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.