Ombreggiatura fisica - illuminazione ambientale / indiretta


15

Ho implementato un tracciatore di percorsi basato sulla fisica dopo aver studiato PBRT di M. Pharr e G. Humphreys. Ora sto provando ad applicare il rendering basato fisicamente alla grafica in tempo reale usando OpenGL ES (in un'applicazione iPhone).

Voglio iniziare a usare Oren-Nayar e Cook-Torrance come BRDF diffuso e speculare, ma ho un problema: come modellare l'illuminazione indiretta?

In un tracciatore di percorsi (come quello contenuto in pbrt) la luce indiretta / ambientale viene data "automaticamente" dall'algoritmo di tracciamento del percorso, poiché segue il percorso dei raggi di luce tenendo conto dell'illuminazione diretta e indiretta.

Come modellare l'illuminazione indiretta in un rendering basato fisicamente scritto in OpenGL ES, quindi utilizzando la grafica computerizzata in tempo reale?

Risposte:


39

La grafica in tempo reale distribuisce una varietà di approssimazioni per far fronte alle spese di calcolo della simulazione dell'illuminazione indiretta, scambiando tra prestazioni di runtime e fedeltà dell'illuminazione. Questa è un'area di ricerca attiva, con nuove tecniche che compaiono ogni anno.

Illuminazione dell'ambiente

All'estremità più semplice della gamma, è possibile utilizzare l' illuminazione ambientale : una fonte di luce globale e omnidirezionale che si applica a tutti gli oggetti nella scena, indipendentemente dalle fonti di luce effettive o dalla visibilità locale. Questo non è affatto preciso, ma è estremamente economico, facile da modificare per un artista e può sembrare a posto a seconda della scena e dello stile visivo desiderato.

Le estensioni comuni all'illuminazione generale di base includono:

  • Fai variare il colore ambientale in modo direzionale, ad esempio usando armoniche sferiche (SH) o una piccola mappa cubica e cercando il colore in uno shader basato sul vettore normale di ogni vertice o pixel. Ciò consente una certa differenziazione visiva tra le superfici con orientamenti diversi, anche quando nessuna luce diretta le raggiunge.
  • Applicare le tecniche di occlusione ambientale (AO) tra cui vertice pre-calcolato AO, mappe texture AO , campi AO e AO spazio-schermo (SSAO) . Tutti questi funzionano tentando di rilevare aree come buchi e fessure in cui la luce indiretta ha meno probabilità di rimbalzare e oscurando la luce ambientale lì.
  • Aggiungi una cubemap ambientale per fornire una riflessione speculare ambientale. Una mappa cubica con una decente risoluzione (128² o 256² per faccia) può essere abbastanza convincente per speculare su superfici curve e lucide.

Illuminazione indiretta al forno

Il prossimo "livello", per così dire, di tecniche prevede la cottura (pre-elaborazione offline) di una rappresentazione dell'illuminazione indiretta in una scena. Il vantaggio della cottura è che puoi ottenere risultati di alta qualità con poche spese di calcolo in tempo reale, dal momento che tutte le parti dure vengono fatte in forno. I compromessi sono che il tempo necessario per il processo di cottura danneggia il tasso di iterazione dei progettisti di livello; più memoria e spazio su disco sono necessari per memorizzare i dati precompilati; la possibilità di modificare l'illuminazione in tempo reale è molto limitata; e il processo di cottura può utilizzare solo informazioni provenienti dalla geometria di livello statico, pertanto ci mancheranno effetti di illuminazione indiretta da oggetti dinamici come i personaggi. Tuttavia, l'illuminazione al forno è oggi ampiamente utilizzata nei giochi AAA.

Il passaggio di cottura può utilizzare qualsiasi algoritmo di rendering desiderato, inclusi tracciato del percorso, radiosity o utilizzando lo stesso motore di gioco per eseguire il rendering di cubemap (o emicubi ).

I risultati possono essere memorizzati in trame ( mappe luminose ) applicate alla geometria statica nel livello e / o possono anche essere convertiti in SH e memorizzati in strutture di dati volumetriche, come volumi di irraggiamento (trame di volume in cui ogni texel memorizza una sonda SH) o maglie tetraedriche . È quindi possibile utilizzare gli shader per cercare e interpolare i colori da quella struttura di dati e applicarli alla geometria di rendering. L'approccio volumetrico consente di applicare l'illuminazione cotta su oggetti dinamici e geometria statica.

La risoluzione spaziale delle mappe luminose ecc. Sarà limitata dalla memoria e da altri vincoli pratici, quindi potresti integrare l'illuminazione al forno con alcune tecniche AO per aggiungere dettagli ad alta frequenza che l'illuminazione al forno non può fornire e per rispondere a oggetti dinamici (come oscurare la luce indiretta sotto un personaggio o un veicolo in movimento).

C'è anche una tecnica chiamata trasferimento di radianza precompilato (PRT) , che estende la cottura per gestire condizioni di illuminazione più dinamiche. In PRT, invece di cuocere l'illuminazione indiretta stessa, si esegue la funzione di trasferimento da una fonte di luce, di solito il cielo, all'illuminazione indiretta risultante nella scena. La funzione di trasferimento è rappresentata come una matrice che trasforma i coefficienti SH dalla sorgente alla destinazione in ciascun punto del campione di cottura. Ciò consente di modificare l'ambiente di illuminazione e l'illuminazione indiretta nella scena risponderà in modo plausibile. Far Cry 3 e 4 hanno utilizzato questa tecnica per consentire un ciclo continuo diurno-notturno, con illuminazione indiretta che varia in base ai colori del cielo ad ogni ora del giorno.

Un altro punto sulla cottura: può essere utile disporre di dati al forno separati per l'illuminazione indiretta diffusa e speculare. Le cubemap funzionano molto meglio di SH per i speculari (poiché le cubemap possono avere molti più dettagli angolari), ma occupano anche molta più memoria, quindi non puoi permetterti di posizionarle così densamente come i campioni SH. La correzione della parallasse può essere utilizzata in qualche modo per compensare ciò, deformando euristicamente la mappa cubica per far sentire i suoi riflessi più radicati nella geometria circostante.

Tecniche completamente in tempo reale

Infine, è possibile calcolare l'illuminazione indiretta completamente dinamica sulla GPU. Può rispondere in tempo reale a cambiamenti arbitrari di illuminazione o geometria. Tuttavia, c'è ancora un compromesso tra prestazioni di runtime, fedeltà dell'illuminazione e dimensioni della scena. Alcune di queste tecniche necessitano di una potente GPU per funzionare e potrebbero essere realizzabili solo per scene di dimensioni limitate. In genere supportano anche solo un singolo rimbalzo di luce indiretta.

  • Una cubemap di ambiente dinamico, in cui le facce della cubemap vengono ridigitate ad ogni fotogramma usando sei telecamere raggruppate attorno a un punto scelto, può fornire decenti riflessi ambientali per un singolo oggetto. Questo è spesso usato per l'auto del giocatore nei giochi di corse, per esempio.
  • Illuminazione globale dello spazio dello schermo , un'estensione di SSAO che raccoglie l'illuminazione rimbalzante dai pixel vicini sullo schermo in un passaggio di post-elaborazione.
  • La riflessione ray- tracing dello spazio-schermo funziona marciando i raggi attraverso il buffer di profondità in un post-pass. Può fornire riflessi di alta qualità purché gli oggetti riflessi siano sullo schermo.
  • La radiosità istantanea funziona tracciando i raggi nella scena usando la CPU e posizionando una luce puntiforme in ciascun punto colpito del raggio, che rappresenta approssimativamente la luce riflessa in uscita in tutte le direzioni da quel raggio. Queste molte luci, note come luci punti virtuali (VPL), vengono quindi visualizzate dalla GPU nel solito modo.
  • Le mappe d'ombra riflettenti (RSM) sono simili alla radiazione istantanea, ma i VPL vengono generati rendendo la scena dal punto di vista della luce (come una mappa d'ombra) e posizionando un VPL su ciascun pixel di questa mappa.
  • I volumi di propagazione della luce sono costituiti da griglie 3D di sonde SH posizionate in tutta la scena. Gli RSM vengono renderizzati e utilizzati per "iniettare" luce di rimbalzo nelle sonde SH più vicine alle superfici riflettenti. Quindi un processo simile a un'inondazione diffonde la luce da ogni sonda SH ai punti circostanti nella griglia, e il risultato di questo viene usato per applicare l'illuminazione alla scena. Questa tecnica è stata estesa anche allo scattering volumetrico della luce .
  • La tracciatura del cono di Voxel funziona voxelizzando la geometria della scena (probabilmente usando varie risoluzioni voxel, più fine vicino alla telecamera e più grossolana lontano), quindi iniettando luce dagli RSM nella griglia del voxel. Durante il rendering della scena principale, il pixel shader esegue una "traccia del cono", una marcia del raggio con raggio progressivamente crescente, attraverso la griglia del voxel per raccogliere la luce in entrata per ombreggiature diffuse o speculari.

La maggior parte di queste tecniche non sono oggi ampiamente utilizzate nei giochi a causa di problemi che aumentano fino a dimensioni realistiche della scena o altre limitazioni. L'eccezione è la riflessione dello spazio dello schermo, che è molto popolare (sebbene di solito sia usata con cubemap come fallback, per le regioni in cui la parte dello spazio dello schermo fallisce).

Come puoi vedere, l'illuminazione indiretta in tempo reale è un argomento enorme e anche questa (piuttosto lunga!) Risposta può fornire solo una panoramica e un contesto di 10.000 piedi per ulteriori letture. Quale approccio è meglio per te dipenderà molto dai dettagli della tua particolare applicazione, da quali vincoli sei disposto ad accettare e da quanto tempo devi dedicare.


Ciao @Nathan, grazie per la tua risposta dettagliata. So che questo è un argomento enorme (e una grande materia di studio). Il problema più grande è che la documentazione online è frammentata ed è difficile trovare un buon approccio. Il mio progetto è questo goo.gl/Fgo21x : un visualizzatore BRDF (ispirato al visualizzatore WDAS) per mostrare i modelli BRDF empirici e fisicamente più comuni e che supporta il calcolo dei colori utilizzando i dati spettrali - valori di tristimolo. Questo è un progetto educativo per studiare OpenGL.
Fabrizio Duroni,

Penso che un buon primo approccio potrebbe essere l'uso dell'estensione comune che hai citato: SH o piccola mappa del cubo + mappa cubo ambientale (per la riflessione e la rifrazione). Cosa ne pensi? (Sto sviluppando questa applicazione dopo il lavoro durante le mie notti insonni :)). Grazie ancora per la raccolta di fonti che hai collegato sopra (ho molto materiale da studiare ora).
Fabrizio Duroni,

@FabrizioDuroni Yep! Per un visualizzatore BRDF, un semplice ambiente direzionale più una mappa cubica ambientale dovrebbe essere eccezionale.
Nathan Reed,

Forse questo rientra in una delle tue categorie, ma non è tecnicamente una tecnica completamente in tempo reale render-to-all-faces-of-a-cub-map? Inoltre, non è possibile aumentare l'ambiente di base con una cubemap ambientale anche per riflessi diffusi?

@racarate Mi dispiace aver impiegato un po 'di tempo per rispondere, ma sì, hai ragione! Penso che volevo menzionarlo, ma ho dimenticato. :) Comunque l'ho aggiunto. (Ho menzionato l'uso di una mappa cubica per diffuso, nel primo punto elenco.)
Nathan Reed,

5

Questo è il principale problema "difficile" che rimane nella CG in tempo reale e ci sono molte ricerche in corso per risolverlo.

Il più grande ostacolo è che nella grafica raster, ogni componente della scena è reso "nel vuoto" - ogni triangolo è reso senza riferimento ad altri triangoli nella scena, e lo stesso vale per i pixel, al contrario degli approcci di ray-tracing dove ogni raggio ha accesso all'intera scena in memoria. Quindi i programmatori in tempo reale devono usare i trucchi per fare cose come riflessi e ombre, e lo stesso vale per l'illuminazione globale.

Un metodo di runtime economico consiste nell'utilizzare mappe luminose al forno, in cui esegui prima qualcosa di lento ma fantastico come la radiosity o il tracciamento del percorso offline, quindi salva le informazioni sull'illuminazione insieme ai tuoi dati di vertice regolari. Questo è ottimo per la geometria statica, ma diventa problematico non appena aggiungi oggetti in movimento. Michal Iwanicki ha fatto una buona presentazione su come hanno risolto questo problema per "The Last of Us".

Le armoniche sferiche sono molto utilizzate nei motori di gioco per rappresentare la luce indiretta. Fondamentalmente sono una trasformata di Fourier sulla superficie di una sfera, scartando i componenti ad alta frequenza puoi ottenere un'illuminazione dell'ambiente visivamente piacevole e per lo più accurata in soli 9 coefficienti per colore. Unity, ad esempio, usa SH per generare "sonde luminose" in vari punti della scena, quindi gli oggetti in movimento possono interpolare tra le sonde vicine per ottenere un'approssimazione della luce indiretta nella loro posizione. Il paper di Robin Green è fondamentalmente la bibbia di questa tecnica, ma è piuttosto pesante.

La tecnica calda al momento sembra essere Voxel Cone Tracing, che non prevede alcun passaggio pre-cottura. Non ho familiarità con me stesso, ma a quanto ho capito, implica voxelizzare la tua scena in un mondo in stile Minecraft a bassa risoluzione, posizionando i voxel in una struttura spaziale rapidamente percorribile come un ottetto, quindi lanciando un po 'di larghezza raggi (coni) da ogni punto e controllando quali voxel colpiscono per raccogliere l'illuminazione rimbalzante. NVidia sta spingendo abbastanza forte al momento, e ci sono documenti qui e qui .

Spero possa aiutare :)


0

Il tracciato del percorso è un algoritmo molto costoso dal punto di vista computazionale e non adatto al tempo reale. L'architettura di PBRT non è adatta nemmeno al tempo reale, l'obiettivo principale di PBRT è risolvere l'equazione di rendering, usando l'integrazione Monte Carlo imparziale. Vedi https://en.wikipedia.org/wiki/Unbiased_rendering per maggiori informazioni.

Senza molte ottimizzazioni e vincoli, dubito che sarai in grado di raggiungere prestazioni decenti su un dispositivo mobile.

In ogni caso, il tracciamento dei percorsi può essere implementato in OpenGL, suggerirei di esaminare gli shader di calcolo che sono molto potenti. OpenGL ES 3.1 supporta shader di calcolo con alcune limitazioni minori, a differenza di Desktop GL.

Leggi questa pagina per maggiori informazioni: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)

Buona fortuna!

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.