|
|
|
cignoni@iei.pi.cnr.it |
|
http://vcg.iei.pi.cnr.it/~cignoni |
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ad ogni vertice del triangolo è assegnato un
punto sulla texture |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Modificando le coordinate di texture cambia che
cosa viene disegnato sul triangolo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Modificando la matrice di modelview, l’oggetto
si sposta ma la texture rimane ferma sull’oggetto |
|
|
|
|
|
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() |
|
|
|
|
|
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) |
|
|
|
|
|
|
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. |
|
); |
|
|
|
|
|
|
|
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. |
|
|
|
|
|
|
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)) |
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
L’oversampling puo’ essere gestito |
|
|
|
Nearest texel |
|
|
|
|
|
|
|
|
|
Interpolazione
lineare texel |
|
|
|
|
|
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 |
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
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. |
|
|
|
|
|
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* |
|
|
|
|
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); |
|
|
|
|
|
|
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 |
|
|
|
|
|
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. |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
È 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 |
|
|
|
|
|
|
|
|
Bump-map model with bump, gloss, & decal
skin |
|
|
|
|
Three passes generated diffuse & specular
bump mapping |
|