Radiosity
La radiosity è un algoritmo di illuminazione globale usato durante il rendering in computer grafica 3D. È un'applicazione del metodo degli elementi finiti per risolvere l'equazione di rendering di scene composte di superfici perfettamente diffusive. A differenza dei Metodi Monte Carlo (come il path tracing) che gestiscono tutti i tipi di percorsi luminosi, la radiosità tiene conto solo di quelli che seguono la forma LD*E, ad esempio, percorsi che partono da una sorgente e vengono riflessi diffusivamente un certo numero di volte (anche zero) prima di colpire l'occhio.
Come metodo di rendering, la radiosità venne presentata nel 1984 da ricercatori della Cornell University (C. Goral, K. E. Torrance, D. P. Greenberg and B. Battaile) in un articolo intitolato "Modeling the interaction of light between diffuse surfaces". La teoria era utilizzata in ingegneria per studiare la trasmissione del calore fin dal 1950
Alcuni famosi motori di rendering commerciali basati sulla radiosità sono Lightscape (ora assorbita dal 3D Studio Max dell'Autodesk), Radiozity della Auto*Des*Sys e ElAS (Electric Image Animation System). Radiance è un programma open source della Synthetic Image System che fornisce un'accurata simulazione di luce facendo uso della radiosità.
Caratteristiche estetiche
modificaL'inclusione di calcoli di radiosità nel processo di rendering spesso aggiunge realismo al risultato a causa del modo con cui simula il mondo reale.
Consideriamo una semplice stanza. L'immagine a sinistra è stata generata con un normale renderer ad illuminazione diretta. Esistono tre tipi di luci nella scena, scelte e piazzate dall'autore nel tentativo di creare la giusta illuminazione: luci spot con ombre (per creare l'illuminazione sul pavimento), luce d'ambiente (senza la quale il resto della stanza sarebbe al buio) e luci omnidirezionali senza ombra (per ridurre la piattezza della luce d'ambiente).
L'immagine a destra è stata calcolata con l'uso di un algoritmo di radiosità. C'è una sola sorgente di luce, un'immagine del cielo piazzata all'esterno della stanza. La differenza è ben visibile. Ombre morbide sono visibili sul pavimento, e vari effetti luminosi sono presenti nella stanza. Inoltre, il colore rosso del tappeto viene riflesso sui muri grigi, dandogli un effetto realistico. Nessuno di questi effetti è stato creato ad arte dall'autore, sono tutti frutto dell'algoritmo.
Panoramica dell'algoritmo di radiosity
modificaLa superficie della scena da visualizzare viene divisa in una o più superfici (patch) e l'algoritmo si occupa di una superficie alla volta. Ad ogni passaggio dell'algoritmo viene calcolata la luce che una patch riceve dalle altre. Una parte della luce viene considerata assorbita, il resto viene riflesso nella scena per il prossimo passaggio dell'algoritmo.
Uno dei comuni metodi per la risoluzione dell'equazione di radiosità viene definita shooting radiosity, e risolve in modo iterativo sparando (da qui il nome) luce da una superficie ad ogni passo. Dopo la prima passata saranno illuminati solo gli oggetti che vedono la sorgente di luce. Dopo la seconda altre superfici riceveranno la luce a causa del rimbalzo di quest'ultima sulle patch già illuminate. La scena acquisisce luminosità ad ogni passo, fino a raggiungere una stabilità, dovuta al quasi totale assorbimento della luce da parte delle patch.
Formulazione matematica
modificaIl metodo si fonda sulla base della radiazione termica, visto che consiste nel calcolo dell'ammontare d'energia trasferito tra superfici. Per poter semplificare il calcolo si suppone che tutte le superfici siano perfettamente diffusive. Le superfici vengono solitamente discretizzate in un numero finito di quadrilateri o triangoli sopra i quali viene definita una funzione polinomiale.
Dopo questa frammentazione, l'ammontare d'energia trasferita può essere computata utilizzando la riflessività conosciuta delle patch, combinata con il fattore di forma delle due patch. Questa quantità adimensionale viene calcolata partendo dall'orientamento geometrico delle due patch, e può essere immaginata come la frazione della possibile area emittente della prima patch coperta dalla seconda.
Una descrizione più scientifica descrive la radiosità come l'energia che lascia una superficie in un intervallo discreto di tempo, combinazione dell'energia emessa e riflessa:
dove:
- Bi è la radiosità della patch i.
- Ei è l'energia emessa.
- Ri è la riflettività della patch, restituisce l'energia riflessa se viene moltiplicato per l'energia incidente (quella che arriva dalle altre patch).
- Tutte le j ( ) nell'ambiente renderizzato vengono integrate per BjFji dAj, al fine di determinare l'energia uscente dalla patch j e che arriva su i.
- Fji è il fattore costante che descrive la relazione geometrica tra le patch i e j.
La reciprocità:
da:
Per semplicità d'uso l'integrale viene sostituito da una costante di radiosità sull'intera patch, il che ci porta alla versione semplificata:
Questa equazione può essere applicata ad ogni singola patch. L'equazione è monocromatica, quindi va ripetuta per ogni colore primario.
La costante Fji può essere calcolata in vari modi. I primi metodi utilizzavano un emicubo (un immaginario cubo centrato sulla prima superficie sulla quale la seconda veniva proiettata, metodo creato da Cohen e Greenberg nel 1985) per approssimare il fattore di forma. Questo metodo era computazionalmente costoso per il motivo che un fattore di forma ideale deve essere calcolato per ogni coppia di superfici, il che generava un incremento quadratico.
Riduzione del tempo di computazione
modificaNonostante la formulazione base del metodo porti ad un incremento quadratico della complessità, esistono metodi in grado di ridurre il problema. Il problema può essere riformulato sotto forma di rendering di una scena contenente texture. In questo caso, il tempo di computazione aumenta in modo lineare con l'aumentare del numero delle patch. L'uso di un albero di Partizionamento Spaziale Binario può ridurre ampiamente il tempo speso nel calcolo di quali patch sono nascoste da altre.
Dal momento che la radiosità può essere calcolata con l'uso di algoritmi standard di texture-mapping, questo ci porta ad un'accelerazione disponibile con l'uso di GPU Hardware, disponibile anche per PC standard.
Vantaggi
modificaUno dei vantaggi dell'algoritmo di radiosità è la sua relativa semplicità di spiegazione ed implementazione, il che lo rende ideale per insegnare agli studenti cosa siano gli algoritmi di illuminazione globale. Un normale renderer ad illuminazione diretta contiene tutti gli algoritmi (proiezione tridimensionale, texture mapping, rimozione di superfici nascoste) richiesti per l'implementazione della radiosità. Non serve avere una grande conoscenza della matematica per comprendere ed applicare questo metodo.
Limiti
modificaI metodi di radiosità risolvono solo i percorsi di luce della forma LD*E, ovvero percorsi che partono da una sorgente e vengono diffusi continuamente prima di raggiungere l'occhio. Nonostante esistano numerosi approcci all'integrazione di effetti luminosi tipo riflessione speculare[1] e glossy[2], i metodi basati su radiosità non vengono solitamente usati per risolvere l'Equazione di rendering completa.
I metodi base hanno anche problemi relativi alla visualizzazione (ad esempio nel caso dei bordi degli oggetti) causati da una discretizzazione rozza delle superfici che porta ad errori nel filtro del dominio spaziale. Il discontinuity meshing[3] usa la conoscenza della visibilità per generare una discretizzazione più intelligente.
Confusione circa la terminologia
modificaLa radiosità fu il primo algoritmo di rendering utilizzato ampiamente nel calcolo di luce indiretta diffusa. I metodi precedenti, come il ray tracing Whitted-style, erano in grado di calcolare effetti quali riflessioni, rifrazioni ed ombre ma, nonostante fossero fenomeni globali, non si riferivano ad illuminazione globale. Come conseguenza il termine illuminazione globale venne confuso con interriflessione diffusiva, e Radiosità con illuminazione globale. Invece i tre termini si riferiscono a concetti diversi.
Un'altra fonte di confusione fu il termine radiometrico di radiosity. In un contesto radiometrico, la radiosity rappresenta l'energia per unità d'area (W/m2) emessa da una superficie. Il termine è quasi sconosciuto all'esterno della computer grafica e viene solitamente chiamato emissione radiante.
Note
modifica- ^ Riflessione speculare
- ^ Riflessione glossy Archiviato il 12 ottobre 2006 in Internet Archive.
- ^ Discontinuity meshing
Altri progetti
modifica- Wikimedia Commons contiene immagini o altri file sulla Radiosity
Collegamenti esterni
modifica- (EN) Radiosity Overview, dall'HyperGraph del SIGGRAPH, su siggraph.org. URL consultato il 3 maggio 2019 (archiviato dall'url originale il 25 agosto 2017).
- (EN) Radiosity, di Hugo Elias Archiviato il 23 novembre 2005 in Internet Archive. (descrizione ed esempi grafici)
- (EN) Radiosity, di Allen Martin (spiegazione matematica)
- (EN) ROVER, di Tralvex Yeap (Articolo sulla Radiosity e bibliografia)
- Descrizione dell'algoritmo di radiosità utilizzato nel software open source Blender