Tp 05

Transcription

Tp 05
Programmation 3D
UFR IEEA
20082009
Licence/Master ST-A
Fabrice Aubert
OpenGL - TP 05
Exercice 1 : Textures
Reprenez texture.zip sur le portail. Le répertoire de travail est texture. Dans data vous avez les images
utilisées en tant que textures dans le tp (vous pouvez prendre d'autres images mais la contrainte est que les
images doivent avoir une longueur et une largeur égales à une puissance de 2).
Q 1. Compilez (make dans le répertoire texture) et exécutez. Vous devez voir : un plan (le "sol"), un tore, un
cube et deux quadrilatères adjacents (construit par GL_QUAD_STRIP)).
L'objectif du TP est d'ajouter des textures à ces diérents objets.
L'initialisation d'une texture sera faite dans (voir début source main.cpp) :
GLint
i n i t T e x t u r e ( nom ) ;
La lecture d'une image et l'aectation à un identiant de texture est faite dans readTexture(string nom).
Q 2. Il manque l'aectation du tableau image à l'identiant de texture à la n de readTexture : faites le.
Dans myInit(), quatre identiants de textures sont initialisés avec initTexture.
Pour activer une texture il sut d'appeler :
textureCoord(un_identifiant) :
activation d'une texture dont on spécifiera les coordonnées de texture avec glTexCoord
textureLinear(un_identifiant) :
activation en génération automatique par combinaison linéaire (projection)
textureEnvironment(un_identifiant) :
activation en mode "environment mapping" (génération automatique)
Q 3. Le but de cette question est de préciser les coordonnées de textures à chaque sommet du quad (cf
procédure quad) : les coordonnées de texture doivent être spéciées avant chaque glVertex par l'instruction
glTexCoord2f(s,t).
Vous activerez le placage par coordonnées de texture avant l'appel du tracé du quad par textureCoord(id_tex[1])
(image mont saint-michel. Vous la désactiverez après l'achage par desactiverTexture() (sinon le placage
de la texture resterait actif pour le reste de l'exécution : essayez...).
Faites les glTexCoord qui conviennent, avant chaque glVertex du quad pour avoir une seule fois l'image
plaquée sur tout le quad. Testez.
Changez les ensuite pour avoir deux fois l'image (la même image sur chacun des deux quadrilatères du
quad). Testez. Essayez de plaquer l'image sur les 2 pans du quad en portrait, en paysage, en miroir (les
deux bases de l'image se touchent sur la frontière des 2 pans).
Q 4. Spéciez les coordonnées de texture sur le sol (procédure void sol()) pour plaquer la forêt (identiant
id_tex[0]). Plaquer la texture pour que le ciel s'éloigne de vous à l'achage (photo dans le bon sens).
Q 5. Testez la rotation de texture avec la pile GL_TEXTURE : dans void sol() utilisez la matrice de texture pour
eectuer une rotation animée de l'image (le sol lui reste xe ; faire un glRotate(ax,...) mais sur la matrice
de texture). Faites en sorte que l'image tourne par rapport à son centre.
1
Q 6. OpenGL peut calculer les coordonnées de texture aux sommets (plutôt que de les calculer nous-même et
de les préciser avec glTexCoord).
Visualisez l'image flowers.jpg pour constater sa construction (on peut l'interpréter naïvement comme
l'image d'un jardin qui se reèterait sur une bille en acier).
Appliquez cette texture en environment mapping (appelez textureEnvironment(id_tex[2]) au moment
de tracer le tore). Visualisez l'eet.
Q 7. Activez une projection plane de texture sur le cube (spéciez textureLinear(id_tex[3]) avant l'appel
de cube()) (dans void textureLinear sont précisés des coecients (a, b, c, d) pour la coordonnée s, et des
coecients (e, f, g, h) pour t. La formule appliquée par OpenGL pour calculer les coordonnées de texture en
chaque sommet (x, y, z, w) est :
s = ax + by + cz + dw
t = ex + f y + gz + hw
Visualisez le résultat (notez que la texture est sur deux faces ; la peinture est en miroir sur l'une d'elle).
Modiez les coecients (a, b, ...) pour contrôler la taille et la position de l'image (pour plaquer 4 fois la
peinture sur la face du cube par exemple).
Q 8. Modiez dans void textureLinear, les mots OBJECT en EYE dans les quatre constantes (les projections
sont alors dénies dans le repère de l'observateur).
Visualisez et expliquez (utilisez la rotation avec souris pour bien constater l'eet).
Exercice 2 : MipMap
On travaille dans le même source que l'exo précédent : quand vous appuyez sur '2' vous passez à l'achage
concernant l'exo 2.
Q 1. Exécutez : vous devez voir un rectangle avec une texture de damier plaqué (vous pouvez vous déplacez en
bougeant la souris+click gauche). Constatez les marches d'escalier et les moirés.
Q 2. Remarquez les niveaux de textures (tex0.tga à tex8.tga) qui sont chargés dans myInit.
Appliquez les diérents ltrages (6 constantes en tout : faites en sorte que l'on puisse changer de ltrage en
appuyant sur 'v' par exemple) : constatez les diérences, et expliquez.
Q 3. Les diérents niveaux des tex?.tga ne sont pas construites par moyennage. Pour faire cela, nous utiliserons
sur tex0.tga :
int gluBuild2DMipmaps( GLenum target,
GLint components,
GLint width,
GLint height,
GLenum format,
GLenum type,
const void *data )
2
qui construira automatiquement (en mémoire) les diérents niveaux de mipmap par moyennage (mettez par
exemple en commentaire le glTexImage2d dans readTexture pour le remplacer par le gluBuild2DMipMaps).
Constatez l'eet des diérents ltrages.
Q 4. Testez également les diérents ltrages avec la forêt (changez le tex0.tga par foret512x256.jpg) : notez
le ou qui devient génant pour la perception (c'est le but de méthodes telles que le ltrage anisotropique, non
spéciée en OpenGL, de contrer cet eet de ou).
3

Documents pareils