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.