Le ombre in OpenGl Daniele Varin LS Ing. Informatica Corso di Elementi di Grafica Digitale http://varindaniele.altervista.org
Punto di partenza In OpenGl le luci non proiettano ombre 2
Perché si introducono le ombre Le ombre aumentano il realismo della scena Spesso nel mondo reale non ce ne accorgiamo,, ma in una scena 3D ne notiamo subito l assenza Le ombre permettono di realizzare effetti grafici particolari Spesso l aspetto di alcuni videogames 3D non è realistico solo a causa di uno shadowing imperfetto 3
Tecniche di rappresentazione delle ombre nella grafica 3D 4
Problemi legati alle principali tecniche di shadowing Light maps inutilizzabili per costruire ombre dinamiche Shadow volumes non è sempre semplice determinare il volume da ombreggiare Projected planar shadows funzionano bene solo su superfici piatte In generale non c è una tecnica che funzioni con ogni tipo di scena 5
Le light maps (o shadow maps) (1) Le light maps sono delle particolari texture in cui ogni singolo pixel possiede la proprietà illuminazione Tale proprietà usualmente va da 0 a 1 Viene calcolata in base alla texture da applicare all oggetto e alla distanza dal punto di illuminazione della scena 6
Le light maps (o shadow maps) (2) Light maps con ombre soft possono essere calcolate velocemente grazie ad algoritmi di convoluzione, accelerati mediante Fast Fourier Transform Tali algoritmi sono standard in OpenGl (tecnica stencil buffering ) e in DirectX9 Visto che le light maps sono in pratica textures statiche, questa tecnica è utile per immagini offline statiche, ma non è applicabile su scene dinamiche 7
Shadow volumes (1) Tecnica usata nella grafica 3D dal 1977 per aggiungere le ombre a una scena E la tecnica più comune per rappresentare le ombre calcolandole in real time Ogni scheda video 3D odierna supporta questa tecnica L idea di base di questa tecnica è quella di dividere la scena in 2 parti: i volumi che sono nell ombra e quelli che non lo sono 8
Shadow volumes (2) Per costruire uno shadow volume si va a calcolare la retta che passa dal punto di illuminazione attraverso ogni vertice degli oggetti rappresentati. L insieme di queste proiezioni forma il volume di ombreggiatura. Tutto quello che è presente nel volume di ombreggiatura è in ombra, mentre tutto il resto è colpito direttamente dalla luce. 9
Shadow volumes (3) -1 - Determinazione dell oggetto -2 - Determinazione delle proiezioni dell oggetto -3 - Determinazione dello Shadow Volume -4 - Intersezione dello Shadow Volume con il piano 10
Ombre proiettive planari (Projected planar shadows) Classic computer graphics trick Blair MacIntyre 11
Ombre proiettive planari Dati: l equazione del piano, ax + by + cz + d = 0 la posizione della luce, (x, y, z, w) si va a calcolare la proiezione dei vertici dell oggetto sul piano in base alla posizione della luce si effettua separatamente il rendering dell oggetto dell ombra sul piano di proiezione 12
Dettagli tecnici Ombre proiettive planari Le ombre devono essere calcolate rispetto a piani infiniti Se il piano è coperto con una texture, è difficile calcolare il blending di una o più ombre (problemi di double blending) L ombra può dare problemi se calcolata senza tener conto del volume interno dell oggetto (Zfighting attributes) 13
Ombre proiettive planari Problemi legati a questa tecnica 14
Dettagli di implementazione Fase 1: Definizioni La shadowmatrix è un vettore che conterrà la matrice di ombreggiatura La lightposition definisce la posizione della luce all interno della scena float g_shadowmatrix[16]; float g_lightposition[] = { 2.0f, 6.0f, 0.0f, 1.0f }; 15
Dettagli di implementazione Fase 2: Rendering dell oggetto rendersolidteapot ( 1.0 ); 16
Dettagli di implementazione Fase 3: Calcolo della matrice d ombreggiatura 17
Dettagli di implementazione Fase 3: Calcolo della matrice d ombreggiatura Si calcola il prodotto scalare (dot product) tra il vettore parallelo al piano e quello dal punto di luce al piano: fplane[] è un vettore che contiene i 4 parametri (a, b, c, d) del piano flightpos[] è un vettore che contiene la posizione della luce definiti con 4 parametri (x, y, z, w) ; (x,y,z) è il punto sorgente di luce w è un parametro che determina se la luce è direzionale (w = 0.0) oppure posizionale (w > 0.0) 18
Dettagli di implementazione Fase 3: Calcolo della matrice d ombreggiatura Quindi si effettua il calcolo della matrice di ombreggiatura 4 x 4, che contiene i parametri con cui andremo a modificare la matrice modelview attuale Ogni parametro della matrice è il prodotto degli elementi di flightpos, di fplane e del prodotto scalare calcolato prima 19
Dettagli di implementazione Fase 4: Rendering dell ombra calcolata glmultmatrixf((glfloat *)g_shadowmatrix); gltranslatef( 0.0f, 2.5f, 0.0f ); glrotatef( -g_fspiny_r, 1.0f, 0.0f, 0.0f ); glrotatef( -g_fspinx_r, 0.0f, 1.0f, 0.0f ); rendersolidteapot ( 1.0 ); Si moltiplica la matrice di visualizzazione attuale con la ShadowMatrix Si applicano le stesse trasformazioni dell oggetto Si effettua il rendering dell ombra 20
La tecnica delle ombre proiettive Vantaggi Permette di tracciare ombre su un piano con effetti abbastanza realistici Molto veloce per scene non troppo complesse e con un numero ridotto di fonti di luce 21
La tecnica delle ombre proiettive Svantaggi Non permette di tracciare ombre di oggetti concavi sugli oggetti stessi Produce hard shadows : i contorni delle ombre sono netti (per avere ombre soft si introducono algoritmi di jittering e blending) Di un singolo oggetto si possono creare tante ombre quante sono le fonti di luce, ma il costo computazionale aumenta rapidamente La stessa cosa vale per un numero elevato di piani: se dobbiamo calcolare ombre che cadono su decine di piani diversi, le performances ne soffrono notevolmente 22