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.