Illuminazione di mesh in Computer Grafica: componenti principali Il
Transcript
Illuminazione di mesh in Computer Grafica: componenti principali Il
Illuminazione di mesh in Computer Grafica: componenti principali Il valore di luminosità, o semplicemente il “valore” di un pixel corrispondente geometricamente ad un punto di un poligono di una mesh si calcola mettendo assieme molti addendi. In una prima analisi (allo scopo di questi appunti) considereremo una “ricetta” semplificata come segue: Ltotale = Lambientale+Locclusione+Lemissione+Ldiffusione+Lspeculare Nel seguito discuteremo con qualche dettaglio ciascuna delle componenti elencate sopra. Si noti l'assenza di rifrazione e mirroring in questa discussione (sigh!). Lambientale La esatta replica e simulazione della luce in un ambiente reale è fuori dalla portata anche dei computer più moderni. Ogni sorgente luminosa che contribuisce ad una scena invia vero gli oggetti in essa presenti in modalità disparate. La riflessione/rifrazione dei raggi luminosi in realtà procede per un numero successivo teoricamente infinito di rimbalzi. L'effetto totale viene approssimato con la presenza di un livello costante e uniforme di illuminazione. Tutti i poligoni ricevono un contributo “base” di illuminazione indipendentemente dalla presenza di sorgenti luminose. Tale contributo si chiama “luce ambientale”. Esistono due scelte per determinare il colore e la intensità di questo contributo: a) valore di RGB costante per tutti i poligoni per ogni punto dei poligoni della scena; b) valore di RGB costante per tutti i punti di un poligono. Il colore viene determinato seguendo la normale al poligono e “copiando” il colore dello sky nel punto in cui esso è intersecato dalla normale. Il contributo ambientale “appiattisce” e smussa il contrasto in una scena (come la nebbiolina in una mattina grigia) ed è di norma tenuto molto basso. Locclusione La luce ambientale viene calcolata semplicemente usandole informazioni su ciascun singolo poligono ed eventualmente sullo sky, indipendentemente dalla presenza e dalla disposizione di altri poligoni intorno e vicini. Questo è assai innaturale. Negli angoli di una stanza giunge meno luce ambientale di quanto ne giunga al centro delle pareti... Basandosi su questa osservazione è stato proposto un effetto molto popolare chiamato “ambient occlusion”. Esso funziona, alla base, come segue. Per un punto su un poligono si calcola la percentuale dello sky che un omino posto sul poligono in questione in tale punto vede libero da altri oggetti e da altri poligoni. Se il cielo è interamente “libero alla vista” il contributo di luce ambientale è massimo. Se invece parte del cielo è nascosto (occluso) il contributo “ambientale” che il cielo fornisce al nostro punto sarà ridotto in modo proporzionale. Come viene calcolata la percentuale del cielo che rimane visibile da un punto della scena? In pratica si lanciano un certo numero di raggi a partire dal punto in esame in direzioni casuali tutto intorno. Si contano quanti raggi sul totale dei raggi lanciati incontra effettivamente il cielo e da essi si deduce in maniera approssimata la percentuale di cielo visibile. A causa della randomizzazione dei raggi lanciati si ha però un problema: punti vicinissimi potrebbero dare risultati differenti e ciò solo perché i raggi emessi da essi sono casualmente lanciati in direzioni molto diverse. Questo produce un effetto rumore/granulosità caratteristico di questo effetto “Ambient Occlusion” (AO). Per ridurlo l'unica (costosa) cura è aumentare di molto il numero di raggi casuali lanciati per ogni punto, allungando i tempi di rendering. Lemissione Questo termine simula un materiale incandescente che “brilla” di luce propria. Esso può essere simulato in due modi. Nel modo più semplice esso semplicemente aumenta il valore del colore di pixel relativi al materiale emittente rendendo il loro aspetto come se fossero “luminosi”. Tuttavia questa “illusione” non produce una reale illuminazione dell'ambiente circostante, che in assenza di vere e propri “lamp” (sorgenti luminose) rimane oscura. Nel motore di renderirazzione Belnder Internal (non in Cycles), tuttavia, se si è attivata l'opzione che attiva la luce ambientale un oggetto con materiale emittente si comporta come un AO calcolato però rispetto all'oggetto e non rispetto al cielo. In generale se vogliamo un oggetot come soergente luminosa conviene usare l'area light. Ldiffusione Questo termine simula l'energia di un raggio incidente che un poligono disperde intorno a se indipendentemente dalla posizione dell'osservatore. Questo termine dipende quindi: a) dalla Energia incidente b) dai coefficienti di diffusione (uno per ciascun canale RGB) compresi tra 0 e 1 c) dalla normale al poligono N d) dall'angolo di incidenza della luce L. Ripeto: Qualunque osservatore, da qualunque angolo osservi il poligono “misura” (percepisce) la medesima quantità di luce diffusa. lLa formula generale per questo termine è come segue: Ldiffusione = kdiffusione, colore * Eincidente * f(angolo(N,L)) Nel modello più famoso e comune per il contributo diffusivo detto modello di Lambert f(angolo(N,L)) = cos(angolo(N,L)) Il contributo di luce diffusiva è massimo se la luce è perpendicolare alla superficie (angolo tra Ne L pari a zero) ed è minimo se la luce è perfettamente parallela e radente alla superficie (angolo tra N e L pari ad un angolo retto). Un modello usato è anche il cosidetto modello “toon” (da CAR-toon). In questo modello per la componente diffusiva la funzione non continua f(angolo(N,L)) = 1 se angolo(N,L)<Soglia, 0 altrimenti. In alcune versioni la transizione dal valore 0 al valore 1 è rapida ma la funzione f è mantenuta continua. Un altro modello molto usato è quello di Oren-Nayar. Non val la pena qui di riportarne le formule (ricercale sulla rete!) ma si può dire in modo approssimativo che la “forma” della funzione f usata in questo caso è quella di una funzione coseno “gonfiata” e appiattita intorno all'origine. Il grado di appiattimento dipende da un parametro interpretato come “grezzità” del materiale. Blender fornisce come modello “diffusivo” anche il modello Minnaert, che in realtà è DIPENDENTE dal punto di vista dell'osservatore. Esso è un po' un modello “speculare” negativo (cioè la “specula” dovuta all'effetto luminoso in quesot caso è scura anziché chiara, e per tale motivo intuitivamente assomiglia ad un effetto diffusivo anche se dal putno di vosta matemtico non lo è). In questo caso f(angolo(N,L))= f(angolo(N,L),angolo(N,V)) ove V è la direzione di osservazione. f(angolo(N,L),angolo(N,V) = cos(angolo(N,L))k+1*(1-cos(angolo(N,E))1-k Il parametro k si chiama “darkness”. Gli altri modelli che si trovano nel Blender internal non sono trattati in questi appunti. Lspeculare Questo termine si riferisce alla “specula” cioè alla macchiolina luminosa che appare su materiali lucidi (glossy). La posizione e la intensità di tale macchiolina dipende dalle proprietà del materiale ma anche dalla direzione di visione V, dalla normale alla superficie N e dalla direzione della luce incidente L. La caratteristica più importante è che la energia della luce incidente NON viene riflessa egualmente in tutte le direzioni. Ci sono diversi modelli matematici per simulare questo fenomeno. Il modello più antico è dovuto a Phong. In esso si ha: Lspeculare = kspeculare Lincidente* (cos(angolo(V,R))m R è la direzione della luce riflessa che è quella che forma un angolo eguale ma di segno opposto all'angolo tra la luce incidente e la normale. “m” è detto coefficiente di Phong, più è grande più “glossy” è la superficie. Il modello è stato superato da altri: Cook-Torrance è un modello che cerca di simulare al massimo la fisica. L'immagine mostra il suo comportamento: Un modello simile ma computazionalmente più semplice è dovuto a Blinn: Il contributo speculare può essere regolato anche con una funzione nn continua simile al Toon della componente diffusiva. Questo caso è lasciato all''approfondimento autonomo dello studente.