UJF - M1 Informatique 2005-2006 : Infographie
TP7 : Textures 2D
pdf, sources
Aujourd'hui nous allons voir comment utiliser des textures en openGL.
En openGL, il est possible de charger plusieurs textures en mémoire,
mais une seule est active à la fois. Voici comment, à partir d'une
image PPM, charger la texture associée sur la carte graphique (cf
initdonnees) :
-
- // Charge l'image à partir du fichier
image1 = new PPMImage( ''mon_image.ppm'' );
// Alloue 1 texture, l'identificateur de cette texture est stocké dans le tableau texName
glGenTextures(1, texName);
// Une seule texture à la fois en openGL : active celle qui vient d'être allouée
glBindTexture(GL_TEXTURE_2D, texName[0]);
// Maintenant charge l'image en mipmap (plus simple)
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image1->sizeX, image1->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image1->data);
En cours, vous avez vu qu'à chaque vertex d'un maillage texturé est
associé des coordonnées de textures (que l'on notera s et t).
Etant donné un triangle où les trois sommets ont des coordonnées de
texture :au moment du remplissage de ce triangle, pour chaque pixel,
openGL va interpoler les coordonnés de texture des sommets en fonction
de la position du pixel. Ainsi il pourra aller chercher la position
du pixel correspondant dans la texture.
Pour associer à un vertex une coordonnée de texture, il suffit avant
le glVertex3f, d'utiliser la procédure glTexCoord2f :
-
- glTexCoord2f(s, t);
glVertex3f(x, y, z);
En openGL, une texture est stockée en mémoire dans un domaine de taille
[0:0]x[1:1] (la texture-image originale est donc transformée
en carré sur la carte graphique). OpenGL vous permet de définir deux
comportements lorsque, pour un sommet, vous lui donnez des coordonnées
de texture en dehors de ce domaine (par exemple : (s,t)=(-0.4,+2)).
Soit il coupe à l'intervale [0:0]x[1:1] (GL_CLAMP), soit
il la répête (GL_REPEAT) (pratique pour les textures répétables).
Il est possible de définir un comportement différent dans chaque direction
(s et t).
- Regargez la procédure dessinerFaceTex et, pour les valeurs initiales
de xmin et xmax, faites un schéma du ''mapping'' entre le carré
et la texture.
- Avec les touches 'x/X' et 'c/C' qui modifient xmin et xmax, obtenez
l'image initiale (celle du fichier PPM). Sortez du domaine [0:0]x[1:1],
qu'observez vous et quelle est l'option utilisée ?
- (maintenant vous pouvez changer les valeurs initiales de xmin et xmax
pour visualiser toute l'image dès le début)
La texture chargée en mémoire l'est sous forme de mipmap (reportez
vous à la procédure initGLTextures) :
- Rapprochez vous du plan, le résultat se dégrade. Pour quelle raison
? Si vous étiez la machine openGL, quelle solution proposeriez vous
pour améliorer le rendu ?
- Référez vous à la manpage de glTexParameterf pour avoir plus d'information
concernant les choix des pixels en fonction des coordonnées de texture.
Pourquoi n'y a t-il que deux paramêtres possibles pour l'option GL_TEXTURE_MAG_FILTER
?
- Agrandissez le carré 3D, utilisez la répétition de texture en s et
t et utilisez la seconde texture (''texName[1]''). Eloignez
vous de l'objet et utilisez la touche 'm' pour changer le paramètre
de GL_TEXTURE_MIN_FILTER. Expliquez vos observations ainsi que
le fonctionnement de chacun des modes, ses avantages et ses inconvénients.
Il existe différentes méthodes d'applications d'une texture : par
exemple que chaque couleur du pixel rendu est celle de la texture
ou que c'est un mélange de la couleur provenant de la texture et de
la couleur donnée par le glColor3f (ou le glMaterial).
- Référez vous à la manpage de glTexEnvf.
- Utilisez la touche 'e' pour changer entre ces différents modes et
expliquez leur fonctionnement.
- A partir des 2 images chargées (brick et damier), créez une troisième
texture en RGBA avec pour RGB les mêmes valeurs que l'image ''brick''
et possédant un canal alpha (l'opacité) en fonction du damier noir
et blanc (par exemple : noir = opaque). Essayez les différents modes
avec cette nouvelle texture. Pour cela faites bien attention d'utiliser
le mode RGBA pour la nouvelle texture (il y a donc 4 octets par pixel).
Vous pouvez animer une texture plaquée en modifiant avec le temps
les coordonnées de texture associées aux sommets.
Basez vous sur la texture de brick répétée une vingtaine de
fois. Nous souhaitons l'animer en perturbant légèrement les coordonnées
de texture (par exemple avec une fonction sinus).
- Que faut-il faire pour obtenir une animation fine (détaillée) ?
- Réalisez cette modification et perturbez la texture en fonction du
temps.
Une texture est une suite de pixels. Vous n'êtes pas obligé de vous
baser sur une image PPM pour en créer une, une fonction en C peut
s'en charger.
- Ecrivez une fonction qui remplisse procéduralement une texture répétable
et plaquez la sur le maillage précédent.
UJF - M1 Informatique 2005-2006 : Infographie
TP7 : Textures 2D
This document was generated using the
LaTeX2HTML translator Version 2002-2-1 (1.70)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 0 -show_section_numbers TP7.tex
The translation was initiated by Mathieu Coquerelle on 2005-11-25
Mathieu Coquerelle
2005-11-25