Bump Mapping & Under-Water Effects
Dott. Stefano Tubini
Bump Mapping

Il bump mapping è un metodo per simulare superfici scabrose,
con rilievi, con textures bidimensionali. Per esempio: se
realizziamo un oggetto che rappresenta un tronco di legno, le
fenditure della corteccia, grazie al bump mapping, possono
apparire tridimensionali anche se non sono realizzate realmente
con poligoni. In questo modo, eventuali cambi di illuminazione
possono far apparire tali solchi profondi anche se sono
assolutamente piatti; grazie al bump mapping si possono,
utilizzare molti meno poligoni per disegnare un oggetto 3D.
Bump Mapping Types

Emboss Bump Mapping
Emboss non è il termine corretto: in realtà questo metodo si
dovrebbe chiamare Multi-Pass Alpha Blended Bump Mapping,
che rende molto meglio l'idea di come agisce. Con l'emboss
bump mapping viene creata una texture monocromatica che è la
mappatura luminosa della textures stessa. Riapplicandola sulla
texture principale mediante il canale alfa, che gestisce la
trasparenza dei pixel, si ottiene la texture finale. In pratica, si
sfrutta la variazione dell'angolo di incidenza della sorgente
luminosa per simulare la scabrosità della texture. Questo metodo
di bump mapping è stato il primo realizzato ed è gestibile da
quasi tutti i chip grafici, anche se l'incidenza sulle prestazioni
dipende da come viene poi effettivamente implementato in
hardware. La resa qualitativa non è eccellente.
Bump Mapping Types

Environment map bump mapping :
è uno tra i metodi più nuovi apparsi nel campo della grafica 3D.
Famoso è quello del G400, il chip Matrox che per primo ne ha
diffuso in modo significativo l'utilizzo. L'environment map bump
mapping utilizza 3 texture diverse: la texture di base, una bump
map ed una environment map. La bump map contiene i valori di
altezza dei particolari della texture di base. Per capire meglio
riprendiamo l'esempio della texture della corteccia: avremo i
solchi più profondi che rappresenteranno il livello di base,
avremo i rilievi più alti che potranno sporgere di 10 unità, quelli
intermedi di 5 unità, ecc... Tutti questi valori sono raccolti nella
height map sotto forma di una matrice di valori. L'environment
map è la matrice che contiene le informazioni su cosa deve
essere fatto: in genere, l'environment map può essere una
semplice mappa di illuminazione, ma può contenere anche altri
effetti da applicare. Alla fine, quando le 3 texture sono combinate
insieme, si ottiene quella finale che sarà applicata sul poligono.
Environment map bump mapping
Bump Mapping Types

Dot3 Bump Mapping :
Questo metodo di bump mapping è anche detto Dot Product
Perturbed Bump Mapping o Per-pixel lighting. L'algoritmo alla base
del Dot3 mapping è relativamente semplice e si basa sulla
creazione di una normal map, vale a dire una mappa dove i valori di
ogni singolo pixel non rappresentano un colore come nelle texture
convenzionali (secondo il classico schema RGB [red-green-blue])
ma vettori 3D, o normali (rette perpendicolari). A questo punto si
esegue un prodotto (da cui "dot product") tra queste normali ed il
vettore della luce: il risultato indica l'intensità di riflessione della luce
per ogni pixel trattato. Modulando questo valore con il pixel della
texture di base si ottiene la texture finale che sarà applicata
all'oggetto.
Dot3 Bump Mapping

Texture

Normal Map

Final Image
Bump Mapping (Normal Map)




Generata da programmi dedicati a partire dalla
immagine della texture di partenza.
Esiste un plugin del noto programma di grafica
open-source Gimp per la loro creazione.
La Normal map è rappresentata da una matrice a
due dimensioni di valori di elevazione. Questa bump
map è definita come la differenza scalare F(u,v) tra
la superficie piatta P(u,v) e la superficie rialzata
desiderata P'(u,v) lungo la normale N per ogni punto
u,v della texture.
I colori rosso, verde, e blu della Normal map
rappresentano I valori delle X, Y, Z del vettore
normale in ogni punto.
Bump Mapping (Teoria 1)

Scostamento rispetto a u :

Scostamento rispetto a v :

Calcolo della nuova normale :
Bump Mapping (Teoria 2)


Il vettore normale a u,v è calcolato mediante
il prodotto incrociato delle derivate parziali di
P' in u e v.
I valori Fu e Fv sono facilmente calcolabili
come scostamenti della 2D bump map, e Pu
e Pv possono essere calcolati direttamente
dalle cordinate della superficie.
Dot3 Mapping (Codice)
Associo normal map alla texture unit 0
glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, oggetto3D->normalMap);
glEnable(GL_TEXTURE_2D);
//Associo normalisation cube map alla texture unit 1. Normalisation cube map: può essere vista come
6 texture 2D posizionate in modo da formare un cubo.
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normalisationCubeMap);
glEnable(GL_TEXTURE_CUBE_MAP_ARB);
… Dot 3 Bump Mapping
glActiveTextureARB(GL_TEXTURE1_ARB);
…
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGB_ARB);
…
… Texture Rendering
Parallax Mapping

Parallax Mapping è un miglioramento della tecnica
del bump mapping applicata alle textures nelle
applicazione di 3D rendering come i video games.
Le textures, con l’utilizzo di questa tecnica avranno
una maggiore profondità e realismo senza
aumentare la loro complessità poligonale.

Il Parallax mapping agisce su di una texture
modificando le coordinate di ogni punto che la
compone di un valore uguale a quello riportato nella
normal map associata.
Parallax Mapping
Senza Parallax Mapping
Con Parallax Mapping
Under-Water Effects

Componenti Effetto Sottomarino





Colore sfondo.
Nebbia.
Caustics su Oggetti Scena.
Superficie marina.
Moto ondoso della superficie.
Effetto Nebbia



Rende più realistica la simulazione di visibilità sottomarina.
La luce ha più difficoltà a penetrare in un mezzo denso come
l’acqua rispetto all’aria.
Le particelle d’acqua tendono a diffondere in ogni direzione la
radiazione luminosa.
GLfloat fogColor[4] = {0.23, 0.52, 0.99, 0.7};
glFogi (GL_FOG_MODE, GL_EXP);
glFogfv (GL_FOG_COLOR, fogColor);
glFogf (GL_FOG_DENSITY, 0.015);
glHint (GL_FOG_HINT, GL_NICEST);
glClearColor(0.23, 0.52, 0.99, 0.7);
Caustics 1




Riproducono l’andamento della luce che
attraversa una superficie di acqua
Textures generate mediante algoritmi
matematici
Riproducono pattern di immagini continui
Esistono programmi che si occupano di
generarle (Caustics Generator)
Caustics 2



La luce colpendo la superficie increspata
dell'acqua genera degli effetti di focalizzazione
o “caustics" sulle superfici subacquee (come
sulle pareti di una piscina). Questo movimento
lumimoso è un'indicazione importante per la
distinzione tra ambientazioni subacquee e
ambientazioni terrestri.
I patterns caustici sono dinamici in modo che in
ogni frame è possibile osservare una leggera
variazione dell’effetto.
Il piano di proiezione delle caustics textures è
quasi tangente alla superficie marina
rappresentata, così che le caustics disegnate
appaiono sempre più allungate man mano che
la superficie su cui sono riportate diviene
verticale.
Caustics (Codice)
…Caricamento Caustics Textures
for (int i=0; i<64; i++) {
char filename[80];
BITMAPINFO *BitmapInfo; /* Bitmap information */
imageData = LoadDIBitmap(filename, &BitmapInfo);
//Converti immagine in texture
GLuint Texindex = i + 21;
glGenTextures(1, &Texindex);
glBindTexture(GL_TEXTURE_2D, i + 21);
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, BitmapInfo->bmiHeader.biWidth, BitmapInfo>bmiHeader.biHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (const GLvoid *) imageData );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
free(imageData);
}
Caustics (Codice 2)
…Disegno le Caustics Textures su un Oggetto
/* The 0.03 in the Y column is just to shift the texture coordinates
a little based on Y (depth in the water) so that vertical faces
(like on the cube) do not get totally vertical caustics. */
GLfloat sPlane[4] = { 0.05, 0.03, 0.0, 0.0 };
GLfloat tPlane[4] = { 0.0, 0.03, 0.05, 0.0 };
sPlane[0] = 0.05 * caustScale;
sPlane[1] = 0.03 * caustScale;
tPlane[1] = 0.03 * caustScale;
tPlane[2] = 0.05 * caustScale;
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, sPlane);
glTexGenfv(GL_T, GL_OBJECT_PLANE, tPlane);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
//associo texture
glBindTexture(GL_TEXTURE_2D,currentCaustic);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
… disegno oggetto
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_2D);
}
Superficie Marina




Mesh piana di triangoli.
Utilizza il bump-mapping per rendere più
realistici gli effetti luce.
Rappresenta un unico oggetto nella scena da
rappresentare.
La mesh sovrasta tutti gli oggetti che
compongono la scena.
Superficie Marina (Moto ondoso)





Utilizzando la Idle function dell’OpenGL si aggiornano le
posizioni dei punti della mesh.
Ad ogni aggiornamento vendono ricalcolate sia le posizioni
(x,y,z) di ogni vertice che le normali ad esse associate.
Dispendioso in fatto di risorse CPU utilizzate.
Formula utilizzata per la simulazione :
 Sinusoide NO !!
 Trocoide SI !! (come mi è stato ricordato da un ingegnere
navale)
Formula Trocoide :
Superficie Marina (Risultato)
Scarica

Tubini_BumpMap_Tesina