Note
Struttura
Costruzione di Interfacce
Lezione 19
Texturing
cignoni@iei.pi.cnr.it
http://vcg.iei.pi.cnr.it/~cignoni
Texture Mapping
Data un’immagine bidimensionale (ad es. una immagine fotografica scannerizzata) viene ritagliata, stirarta o compressa per adattarla esattamente alla forma di un poligono o di una superficie curva e di far sì che vi aderisca sopra come una decalcomania
Colorare una primitiva (triangolo) secondo i colori di una bitmap
Aggiungere dettagli senza aumentare la complessità della geometria dei modelli
Texture Mapping
Coordinate di texture
Per specificare come si colora un porzione di superfice con una texture si definiscono le coordinate di texture che indicano dove ritagliare la bitmap che ci interessa
Coordinate Texture
Per ogni vertice si specifica quindi
Le sue coordinate 3d effettive:
In opengl
glVertex3f(x,y,z)
e le corrispondenti coordinate di texure
In opengl
glTexCoord2f(s,t)
Esempi
Ad ogni vertice del triangolo è assegnato un punto sulla texture
Esempio
Modificando le coordinate di texture cambia che cosa viene disegnato sul triangolo
Esempio
Modificando la matrice di modelview, l’oggetto si sposta ma la texture rimane ferma sull’oggetto
Texture mapping in opengl
Per ogni rendering context
Caricare le texture
creare un nome (glGenTexture)
scegliere il nome di texture (glBind)
caricare un immagine (glTexImage2d)
Per ogni frame:
Scegliere una texture corrente
glBind()
Per ogni Vertice:
specificare le coordinate di texture
glTexCoord()
Caricare una texture
Ogni texture ha un nome con cui puo’ essere richiamata velocemente
glGenTextures(n, int *names)
crea n nomi di texture memorizzandoli in names[]
Per scegliere la texture corrente
glBind(GL_TEXTURE2D, texturename)
Loading an image
Si passa ad opengl il blocco di mem che rappresenta la texture. Opengl lo copia nella memoria della scheda e lo formatta come meglio crede. Operazione piuttosto lenta.
void glTexImage2D(GL_TEXTURE_2D
  GLint level,         // the mipmap level
  GLint components,    // number of color component (1..4)
  GLsizei width,       // must be 2^n
  GLsizei height,      // must be 2^n
  GLint border,        // width of border
  GLenum format,       // GL_RGB, GL_RGBA, GL_ALPHA ecc
  GLenum type,         // data type of pixel (GL_BYTE, ecc)
  const GLvoid *pixels // a pointer to the image.
);
Loading a Texture
Il problema maggiore è come caricare un’immagine:
Generarsi la texture da soli (facile per scacchiere e affini)
Scriversi un lettore per un formato di immagini molto semplice (.pbm)
Utilizzare una lib tipo glpng, devil, CImage (MFC 7.0), CTexture.
glPng
Libreria free che permette di caricare come texture un’immagine in formato png
#include <gl/glpng.h>
…
pngInfo info;
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
pngLoad(filename, PNG_NOMIPMAP, PNG_SOLID, &info))
Parametri Texture
glTexParameter permette di settare di come si sceglie quali texel usare per il texturing
GL_TEXTURE_MIN_FILTER
GL_TEXTURE_MAG_FILTER
GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
Mipmapping
Texel e pixel non corripondono:
Quando si guarda un oggetto textured da vicino si hanno molti pixel per un texel (oversampling della texture)
Quando si guarda un oggetto textured da lontano si hanno molti texel che cadono in uno stesso pixel (subsampling texture)
Mipmapping
L’oversampling puo’ essere gestito
Nearest texel
Interpolazione
lineare texel
MIPMAPPING
Il subsampling puo’ essere gestito
Nearest texel
Nearest texel in un’altra texture grande la metà e filtrata bene (mipmapping)
Per ogni texture si tiene un insieme di texture prefiltrate ognuna grande la metà della precendente
MipMapping
Utilizzare una texture
Texture environment:
Specificare come si vuole combinare il colore della texture con il colore corrente
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, ???? );
GL_MODULATE moltiplica il colore della texture per il colore dell’oggetto dopo lo shading (in questo modo la texture viene ombreggiata)
GL_DECAL il colore viene applicato esattamente.
Ci sono anche altri modi supportati un po’ meno (fanno parte dello standard 1.3)
Coordinate di texture
Esplicite
Occorre salvare nel modello, per ogni vertice, dove va a finire sulla texture
Fa parte del lavoro di modellazione fatto dall’artista di turno
Notare come sono impaccate bene le varie porzioni in cui è suddivisa la mesh.
Coordinate di texture
Implicite
Generate automaticament da Opengl in base alle coordinate dei vertici e alla matrice di modellazione corrente
Object_Linear
Eye_linear
Sphere_map
Reflection_map*
Normal_map*
Object Linear
Si può generare ogni texture coordinate (s,t,…) come funzione lineare delle sue coordinate
Ad esempio
 glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
 glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
 float planevs[4]={1.0,0,0,0};
 float planevt[4]={0,1.0,0,0};
 glTexGenfv(GL_S,GL_OBJECT_PLANE,planevs);
 glTexGenfv(GL_T,GL_OBJECT_PLANE,planevt);
Sphere map
Si generano coordinate texture, per vertice, in base a dove la normale dell’oggetto colpisce una sfera intorno all’oggetto stesso.
La superfice della sfera è mappata nello spazio di texture come in figura
Texture
Non solo colore
Texture mapping è utilizzato anche per spargere altri tipi di attibuti sulla superficie di un oggetto:
Normali (bump mapping)
Posizione (displacement mapping)
Trasparenza (alpha)
Shininess
Ombre portate.
Bump Mapping
Bump Map
Bumpmapping
Le normali sono
codificate nello
spazio rgb signed
Esiste un texture
environment
DOT3_RGB
La direzione della
luce viene passata
come colore
corrente della mesh
MultiTexture
È possibile specificare più di una texture per una singola primitiva
Le varie texture sono applicate in sequenza usando il risultato del precedente texturing per mixarlo con la texture corrente secondo un proprio texture environment
MultiTexturing
Light maps
Gloss mapping
Per pixel lighting
Bump-map model with bump, gloss, & decal skin
Per pixel lighting
Three passes generated diffuse & specular bump mapping