TP 2: Apparence et Ombrage OpenGL
But:
Dans ce TP, vous allez travailler sur l'apparence des objets, en
multipliant les combinaisons des différents paramètres vu en cours:
ombrage plat ou doux, couleurs directes ou combinaison matériaux /
lumières, et enfin avec ou sans texture.
Description:
Le programme ouvre une fenêtre sur un environnement contenant une sphère,
les deux objets plans tracés dans le TP précédent et un plan horizontal
situé en dessous de ces objets. Tous les objets sont tracés en plein. Le
programme compile déjà, mais vous présente les objets sans aucune
caractéristique d'apparence. Le travail consistera à intégrer au code
existant les composantes d'ombrage requises.
Pendant l'exécution du programme, tous les paramètres d'apparence
seront contrôlables par l'intermédiaire d'un menu accessible grâce au
bouton droit de la souris. La sélection d'un élément du menu
active ou désactive alternativement le paramètre correspondant. Le
menu est déjà en place, mais il n'a pour l'instant aucun effet
visible.
Le programme fourni comprend par ailleurs une solution au problème de
la navigation du TP précédent.
Implémentation:
Lumières:
-
Vous devez définir une lumière ambiante globale de (1, 0.8, 1).
C'est totalement irréaliste, mais ça permet de voir un peu les
objets sans aucune autre lumière activée.
-
Vous devez définir une lumière directionnelle
LIGHT1
avec
les paramètres suivants (histoire de simuler le soleil qui n'est pas
tout à fait au zénith):
- Lumière ambiante: noire
- Lumière diffuse: (1, 0.8, 1)
- Lumière spéculaire: blanche
- Position: dans la direction (0, 1, 0.5) à l'infini
-
Vous devez définir un projecteur positionnel
LIGHT0
avec
les paramètres suivants (comme si vous vous baladiez avec une torche):
- Toutes composantes de lumière: blanche
- Un angle projectif de 20 degrés au total
- Ce projecteur doit pointer droit devant vous
Objets:
-
Donnez à la sphère une couleur blanche (utilisée quand il n'y a
pas de lumière), et un matériau émeraude:
- Composante ambiante: (0.0215, 0.1745, 0.0215)
- Composante diffuse: (0.07568, 0.61424, 0.07568)
- Composante spéculaire: (0.633, 0.727811, 0.633)
- Brillance: 76.8
-
Donnez au rectangle les couleurs rouge, vert, bleu, blanc pour
chaque sommet successif. Quand les lumières seront activées, ces
couleurs devront être utilisées en tant que composantes ambiante
et diffuse du matériau. Donnez finalement une composante
spéculaire noire.
-
Donnez au triangle les couleurs rouge, vert, bleu pour chaque
sommet successif. De même que pour le rectangle, quand les
lumières seront activées, ces couleurs devront être utilisées en
tant que composantes ambiante et diffuse du matériau. Donnez
finalement une composante spéculaire noire.
-
Donnez au plan horizontal une couleur blanche, utilisée sans
lumière et sans texture. Pour les autres cas, définissez un
matériau de composantes ambiante et diffuse à rouge.
-
La boîte englobant la sphère, quand à elle, ne devra faire l'objet
d'aucune illumination. Elle restera simplement blanche.
Quand les textures sont activées, seul le plan horizontal devra être
texturé. Une texture de bois est fournie dans le fichier
wood.ppm
. Une fonction ppm_read_file
est
fournie et déjà appelée dans le code pour charger la texture. Cette
fonction remplie une variable de type texture_data_t
qui
contient tous les paramètres dont vous avez besoin pour définir la
texture au sens OpenGL.
L'application de la texture devra être conforme aux paramètres
suivants:
- La texture est répétée selon les deux axes
- Le filtrage doit être linéaire
- La texture doit être reproduite 5 fois dans les deux sens
Culling et autres rappels:
Contrairement au TP précédent, nous souhaitons maintenant voir le
triangle et le rectangle des deux côtés. En conséquence, le culling
ne devra être activé que pour le tracé de la sphère et du plan
horizontal. N'oubliez pas non plus que seul le plan horizontal doit
être texturé, et que seuls les deux objets de côté (rectangle et
triangle) doivent utiliser leurs couleurs simples en tant que
composantes de matériau.
Conseils:
-
Commencez par lire posément le code fourni, afin de vous
familiariser avec son architecture.
-
Écrivez tous les morceaux manquant d'initialisation d'OpenGL, ainsi
que tous les paramètres qui ne changeront pas d'abord.
-
Attaquez-vous graduellement au problèmes d'apparence: commencez
par les couleurs simples, puis travaillez sur la texture. Attaquez
vous finalement aux matériaux et aux lumières, et réfléchissez
bien au problème de la position des sources lumineuses.
-
Remplissez au fur et à mesure les trous de la fonction
menu_handle
. Ce remplissage ne présente presque
aucune difficulté. Pour chaque paramètre, la macro
TOGGLE
implémente une variable entière qui vaut 0 ou
1, selon que le paramètre doit être activé ou non.
Fonctions utiles:
glEnable, glDisable, glPushAttrib, glPopAttrib, glLoadIdentity,
glShadeModel, glNormal3f, glColorMaterial, glColor3f,
glLightModeli, glLightModelfv, glLightf, glLightfv,
glMaterialfv, glTexEnvf, glTexParameteri, glTexImage2D, glTexCoord2f