Corso Di Programmazione Grafica aa2005/2006 titolo Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Texturing - Tessiture Daniele Marini Più modalità • es. muro di mattoni: texture invece di modellazione – mappare una fotografia di un muro di mattoni su una superficie – simulare opacità del cemento e “lucentezza dei mattoni” con funzione immagine che modula la lucentezza – simulare la “rugosità” del mattone con bump mapping Programmazione Grafica aa2005/2006 3 Come opera • durante il rendering per ogni locazione su una superficie: – la superficie viene orientata secondo il punto di vista – si applica il modello di illuminazione • considerando luci e proprietà del materiale • se necessario applicando effetti nebbia o trasparenza – il colore viene modificato secondo la funzione di texture – se presente si modifica il coefficiente di lucentezza secondo la funzione di lucentezza – se presente, si modifica la normale secondo la funzione di bump mapping Programmazione Grafica aa2005/2006 4 Texture mapping • 2D, 3D o 4D • La texture è una qualsiasi immagine • L’operazione di mapping trasferisce l’immagine sulla superficie Programmazione Grafica aa2005/2006 5 Pipe-line di texturing Usa una funzione di proiezione MAPPING Calcola posizione nello spazio mondo (x,y,z) Es: proiezione ortografica (proiettare una slide) (u,v) in (0,1) Modifica valore di illuminazione Applica modello illuminazione con terna R,G,B Usa una funzione di corrispondenza Da (0,1) a es. (256x256), trova valore in array R,G,B Applica funzione di trasformazione dei valori Es. moltiplica R,G,B per 1.1 per evitare valori troppo scuri Programmazione Grafica aa2005/2006 6 • La configurazione di texture 2D è definita sul piano s,t - coordinate di texture normalizzate in [0,1] o in coord. di array, T(s,t) è la texture • Gli elementi dell’array di texture sono i texels – La funzione di mapping associa a ogni punto dell’oggetto un unico valore di T, un unico texel Programmazione Grafica aa2005/2006 7 • I valori di T sono espressi in (R,G,B) • La terna viene usata per modificare la terna (r,g,b) del punto dell’oggetto come calcolata dal modello di illuminazione durante la fase di shading Programmazione Grafica aa2005/2006 8 Funzioni di proiezione • proiezione piana o ortografica – piano su piano • proiezione parametrica – piano texture su superficie parametrica • proiezione sferica (a due passi) – piano texture su più superfici • proiezione cilindrica (a due passi) – piano texture su più superfici Programmazione Grafica aa2005/2006 9 Proiezione piana • le coordinate (u,v) della texture sono associate alle coordinate proiettate x,y Programmazione Grafica aa2005/2006 10 Proiezione parametrica • Il mapping: se la superficie è parametrica un punto è: x(u,v) p(u,v) y(u,v) z(u, v) • Si associa T(s,t) a p(u,v) • L’associazione può essere diretta (u=s, v=t) o lineare : u as bt c v ds et f Programmazione Grafica aa2005/2006 11 Proiezione parametrica – La funzione è invertibile se ae ≠ bd – La conversione alle coordinate schermo: u umin s smin (u umin ) smax smin max t t min v v min (v max v min ) – Questo approccio non tmax tiene tmin conto della curvatura, la texture viene stretchata sulla superficie Programmazione Grafica aa2005/2006 12 Proiezione cilindrica – Per proiezione sferica e cilindrica si segue un approccio a due passi: • Mappare su una sfera o un cilindro (oggetto intermedio) S mapping • Mappare la struttura ottenuta sull’oggetto finale - O mapping Cilindro con raggio r e altezza h : x r cos(2u) y r sin( 2u) z v /h mappa : su t v con u, v 0,1 • Secondo passo: Programmazione Grafica aa2005/2006 13 Proiezione sferica • si proietta sulla sfera con l’equazione: r arccos(rz ) f atan2(ry ,rx ) dove : 0 atan2(y, x) 2 , prende come argomento y/x con x 0 • dove: r,f sono latitudine e longitudine sulla sfera; rx, ry, rz, sono direzioni di proiezione (riflessione), vettori normalizzati Programmazione Grafica aa2005/2006 14 Secondo passo • nel secondo passo si sceglie come proiettare sull’oggetto finale l’oggetto intermedio in funzione della normale al punto considerato sull’oggetto - 3 modi: – normali dirette dall’oggetto intermedio all’oggetto finale – normali in ogni punto dell’oggetto finale – normali dirette dal centro dell’oggetto finale Programmazione Grafica aa2005/2006 15 Funzioni di corrispondenza • Indicano come deve essere mappata la texture: – Wrap, repeat, tile: l’immagine viene ripetuta come una piastrella – Mirror: l’immagine viene ripetuta riflettendola verticalmente o orizzontalmente – Clamp to edge: i valori esterni a (0,1) sono forzati agli estremi, il bordo dell’immagine si prolunga su tutta la superficie – clamp to border: i valori esterni a (0,1) sono resi con un colore proprio, va bene per decalcomanie Programmazione Grafica aa2005/2006 16 Funzioni di modifica • Replace: rimpiazza i valori R,G,B della texture agli r,g,b del modello di illuminazione - chiamato anche glow texture • Decal per simulare decalcomanie: sfrutta canale alfa per modulare r,g,b,alfa con R,G,B,ALFA • Modulate: moltiplica r,g,b per R,G,B Programmazione Grafica aa2005/2006 17 Image texture • Mappare una immagine es. 256 x 256 su una superficie piana; se la superficie proiettata supera o è inferiore alla risoluzione dell’immagine: – Magnification – Minification Programmazione Grafica aa2005/2006 18 Magnification • Nasce aliasing, si supera con interpolazione – Nearest neighbor: produce pixellizzazione, va bene per piccoli ingrandimenti (max fattore 2) – Interpolazione bilineare: smoothing – Altri filtri per ingrandimenti elevati (ricampionamento) Programmazione Grafica aa2005/2006 19 Magnification Nearest neighbor inpterpolazione bilineare Programmazione Grafica aa2005/2006 20 Interpolazione bilineare • Interpola Linearmente i valori di texture di 4 texel vicini t1 t2 i t3 valore textur in i = Lerp(lerp(t1, t3), lerp(t2, t4)) t4 Programmazione Grafica aa2005/2006 21 Minification • Molti texel possono cadere sullo stesso pixel – Ancora nearest neighbor, sceglie il texel più vicino al pixel, aliasing forte, soprattutto nella animazione – Ancora interpolazione bilineare: sceglie il texel medio per il pixel – Meglio ricampionamento dell’immagine, in modo da garantire un texel per pixel (frequenza di campionamento ottima) Programmazione Grafica aa2005/2006 22 Minification • Molti texel coprono un pixel (sotto campionamento) Solutione: Accresci campioni o riduci la frequenza massima della texture un pixel metodi: Artefatti di sotto camp. 1. Mip-mapping 2. Rip-mapping 3. Sum Area Table Programmazione Grafica aa2005/2006 23 MipMapping • Mip: “multi in parvo” – L’immagine di texture originale viene affiancata da molte versioni via via più piccole, mediante ricampionamento dell’immagine originale – Livello 0 originale – Livello 1 sottocampionato a un quarto (subtexture), si usa filtro gaussiano – Si prosegue fino alla risoluzione del pixel – Attenzione al gamma!per avere brightness costante Programmazione Grafica aa2005/2006 24 MipMapping • Per scegliere quale texture usare si usa un parametro d per cercare di avere pixel:texel in rapporto 1:1 o 2:1 (frequenza di Nyquist) • Se un pixel ingloba più texel si scende di livello • d individua il livello, la terna (u,v,d) individua il texel, il campione si determina con interpolazione trilineare Programmazione Grafica aa2005/2006 25 MipMapping Non mipmapping mipmapping Programmazione Grafica aa2005/2006 26 Ripmapping • Si sottocampiona anche linearmente lungo u e v • Permette di evitare effetti di sfocatura ai bordi • Si crea una struttura ad array, la diagonale principale contiene la struttura mipmapping, lungo righe e colonne abbiamo le immagini sottocampionate lungo u e v. • si calcolano valori interpolati usando anche le immagini sottocampionate lungo u e v Programmazione Grafica aa2005/2006 27 Ripmapping Programmazione Grafica aa2005/2006 28 Summed area table • filtro anisotropo - calcola il colore medio in una regione rettangolare nello spazio texture a velocità costante • si usa un array 2d della stessa dimensione della texture, si usano più Ogni elemento nell’array memorizza la somma dei bit per maggiore precisione colori di tutti i texel fino all’angolo in basso a sinistra Programmazione Grafica aa2005/2006 29 Summed area table - 2 • usato per filtrare la texture spazio pixel spazio texture y pixel x Calcola il BB dell’area del pixel nella texture e usa SAT per calcolare il colore medio dell’area coperta dal BB Programmazione Grafica aa2005/2006 30 Summed area table - 3 • Come si calcola la somma dei texel nell’area tra A e B? R’ = SAT[B] – SAT[C] – SAT[D] + SAT[A] B C R A D Il valore finale è la media: R’ / (numero texels in R) Programmazione Grafica aa2005/2006 31 Confronto Non filtering Mipmapping Summed area table Programmazione Grafica aa2005/2006 32 Texture mapping in OgL Programmazione Grafica aa2005/2006 33 • Il texturing è fatto durante la rasterizzazione della primitiva • mappa punti 3D in locazioni (pixel) sul display • Ciascun frammento generato viene testato per la visibilità (z-buffer) e se visibile viene calcolato lo shading • Durante l’interpolazione di shading si calcola il valore di texture usando ancora interpolazione tra vertici estremi Programmazione Grafica aa2005/2006 34 Dichiarazione della texture Glubyte my_texels [512][512] /* dichiara una immagine di texture glTexImage2D(GL_TEXTURE_2D,0,components,512,512, 0,format,type, my_texels); /*specifica che l’immagine deve essere una Texture components determina il numero di colori (da 1 a 4) format è determinato dai due parametri successivi (valori dei pixel e dim immagine) glEnable(GL_TEXTURE_2D) Programmazione Grafica aa2005/2006 35 Dichiarazione del modo di mapping glTexCoord2f(s,t) /* range di variazione delle coordinate dello spazio texture La texture viene associata alla primitiva all’atto della dichiarazione: glBegin(GL_QUAD); glTexCoord2f(0.0, 0.0); glVertex2f(x1, y1, z1); glTexCoord2f(1.0, 0.0); glVertex2f(x2, y2, z2); glTexCoord2f(1.0, 1.0); glVertex2f(x3, y3, z3); glTexCoord2f(0.0, 1.0); glVertex2f(x4, y4, z4); glEnd(); Programmazione Grafica aa2005/2006 36 • Posso usare anche un intervallo inferiore di s e t, in tal caso viene mappata solo una parte della texture; • OgL interpola i valori • Cosa succede se si specificano valori di s e t esterni all’intervallo 0,1? – Potremmo volere che la texture si ripeta periodicamente – Oppure vorremmo “clampare” gli estremi ed estendere 0 ed 1 per i valori inferiori o superiori glTexParameter(GL_TEXTURE_WRAP_S, GL_REPEAT) /*texture ripetute glTexParameter(GL_TEXTURE_WRAP_S,GL_CLAMP) /* texture “clampate” Programmazione Grafica aa2005/2006 37 Minification, magnification glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST|GL_LINEAR) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST|GL_LINEAR) GL_NEAREST adotta nearest neighbourgh GL_LINEAR applica un filtro smooth 2x2 Programmazione Grafica aa2005/2006 38 mipmapping • OgL permette di creare una serie di array di texture a risoluzione decrescente gluBuild2DMipmaps(GL_TEXTURE_2D,3,64,64,GL_RGB, GL_UNSIGNED_BYTE,my_texels) /* crea le texture 64x64-32x32-16x16-8x8-4x4-2x2-1x1 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST) /*invoca l’opzione mipmap Programmazione Grafica aa2005/2006 39 Modifica del colore • Il colore può essere modulato (alfa blending) o coperto dalla texture: glTexEnv(GL_TEX_ENV,GL_TEX_ENV_MODE,GL_MODULATE) glTexEnv(GL_TEX_ENV,GL_TEX_ENV_MODE,GL_DECAL) Programmazione Grafica aa2005/2006 40 Bump mapping Programmazione Grafica aa2005/2006 41 Bump mapping n • Perturbazione della normale • Funzione di bump d(u,v):p' p d(u,v)n • Meglio perturbare la normale e non il punto pu pv pu pv x u y pu u z u x v y pv v z v n' p' u p' v dove : d p' u pu n d(u,v)nu u d p' v pv n d(u,v)nv v Programmazione Grafica aa2005/2006 42 Environmental mapping Simula riflessioni a specchio senza ray tracing, chiamato anche reflection map Si calcola la proiezione dell’ambiente su una forma determinata (sfera o cubo nel caso di ambienti chiusi) La proiezione viene trattata come una texture, ma la texture viene proiettata dal punto vista dell’osservatore Programmazione Grafica aa2005/2006 43 • Il programma applicativo deve calcolare la proiezione dell’ambiente sulla superficie intermedia (sfera o scatola) • OgL genera automaticamente le coordinate di texture per un glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP) mapping sferico glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP) glEnable(GL_TEXTURE_GEN_S) glEnable(GL_TEXTURE_GEN_T) Programmazione Grafica aa2005/2006 44 Nebbia ed effetti di profondità • Depth cueing • Fog factor f viene trattato come il coefficiente alfa blending, è approssimato da una funzione del tipo f e 0.5z 2 GLFloar fcolor[4] = […] glEnable(GL_FOG) glFogf(GL_FOG_MODE,GL_EXP) glFoGf(GL_FOG_DENSITY,0.5) glFogfv(GL_FOG_COLOR, fcolor) Programmazione Grafica aa2005/2006 45