Questa pagina contiene le prime due tracce per i progetti di esame del corso. Le ultime saranno ampliate nei prossimi giorni.

Progetto cube mapping
Aggiungere a SoftOgl la funzionalita' per il cube mapping.

Funzioni e variabili da definire:

bool isCubeMappingEnabled;

void CubeMapSide(int id_side, int id_texture);

Materiale:

6 immagini da usare per la cubemap di prova
altre 6 immagini da usare per la cubemap di prova
in formato raw (vedi LoadRaw in main.h)
Suggerimenti:

Se nel vostro esempio di uso del cube mapping volete visualizzare anche l'environment potete piazzare un cubo centrato nel punto di vista con le texture attaccate ai lati ma NON è necessario ai fini dell'esame.
Il valore max riferito nella slide numero 59 della lezione 9 si riferisce al valore della componente piu' grande (in valore assoluto) del vettore di riflessione. Questo valore determina quale delle 6 texture viene acceduta. Se la componente più grande e' la x, allora la texture acceduta sara' pos_x sex>0, neg_x altrimenti.

Esempio con i dati in mountain.rar


proiezione: frustumFrustum(-1,1,-1,-1,1,5);
trasformazione di modello: LookAt(0,0,2,0,0,0,0,1,0);
sfera: Sphere(50,50) (vedi version/main.h main.h)
Progetto mip-mapping
Aggiungere la funzionalita' mipmapping a SoftOgl

Funzioni e variabili da definire:

bool isMipMappingEnabled;

void BuildMipMaps(int id_texture);

Materiale:

texture a quadretti

Progetto shadow-mapping  
Aggiungere la funzionalita' shadowmapping a SoftOgl

Progetto ray-tracing
Implementare un algoritmo di raytracing. In softogl, il progetto consiste nell'aggiungere una funzione RayTrace(..) che prende come argomento la scena ed esegue il raytracing. Questo progetto può essere fatto anche usando opengl invece di softogl.

Progetto Normal Mapping Estendere SofOgl con il NormalMapping

Ambient Occlusion Computation

Questo può essere realizzato sia con SoftOgl che con OpenGl. Si tratta di  usare la tecnica di ambient occlusion di tutti i vertici di un insieme di poligoni.

La tecnica consiste nel "pesare" il contributo di luce ambiente nel calcolo dell'intensità luminosa in un punto con quanto il punto è raggiungibile da raggi di luce provenienti  dall' "esterno" della scena.

La figura qui sotto rappresenta in 2 dimensioni una semplice scena fatta di due oggetti, A e B. L'idea è che il punto v0 sulla superficie di A riceve meno luce ambiente del punto v1, poichè molti dei raggi  di luce che arriverebbero a v0 trovano l'oggetto B sulla propria strada.

In pratica, dato un punto e la  semisfera poggiata sul piano tangente alla superficie e passante per il punto, si vuole calcolare quanta parte dei raggi che partono dal punto e attraversano la semisfera incontrano (intersecano) un altro oggetto nella scena. Dato che le direzioni sono infinite e il tempo per fare il calcolo non lo è, si stima questa frazione provado un numero n di raggi e prendendo h/n , con h numero di raggi che non incontrano altri oggetti, come valore da moltiplicare per il termine ambiente dell'equazione di illuminazione nel modello di phong.

Cosa serve:

a) saper caricare una mesh di triangoli da disco

b) saper calcolare la normale per vertice (vedi  Lez10a.meshes.pdf)

c) saper distribure uniformemente le direzioni nella semisfera

d) calcolare l'intersezione raggio triangolo. A questo scopo è racomandato l'uso di una tecnica che eviti il test di ogni raggio con tutti i triangoli della scena (vedi Lez11.raytracing.pdf)

Il risultato consiste in due programmi distinti:

ComputeAO:

- carica alcune mesh

- calcola l'ambient occlusion, cioè associa ad oni vertice il valore  h/n;

- salva i valori calcolati 

VisualizeAO:

- che carica una mesh in cui ad ogni vertice è associato un valore compreso tra 0 e 1 e la visualizza moltiplicando tale valore per la componente ambient nell'equazione del lighing.