Plaquage de Texture et Eclairage Dans ce TP, vous allez combiner éclairage et plaquage de texture. Récupérez le code du TP précédent. Ajoutez un second carré perpendiculaire au premier.
Chargez les images jointes et activez le plaquage de texture. Utilisez la texture de bois pour le sol, et la texture de pierres pour le mur.
Choisissez les mode de répétition de filtrage adéquats. On veut permettre à lʼutilisateur de tourner la scène à lʼaide de la souris lorsque le bouton droit de la souris en enfoncé : - les routines GLUT mouse et motion devront donc être utilisées. - ajoutez deux variables globales qui vont permettre de tenir à jour la position horizontale et verticale de la souris en coordonnées de la fenêtre. - ajoutez une variable globale supplémentaire afin dʼenregistrer le dernier bouton de la souris qui a changé dʼétat. - ajoutez une autre variable globale pour enregistrer cet état. - le code suivant pourra être utilisé : void mouse(int button, int state, int x, int y) {! if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)! {!! g_mouse_position_x = x;!! g_mouse_position_y = y;! }! g_mouse_button = button;! g_mouse_state = state;! glutpostredisplay(); } - ajoutez deux autres variables globales qui correspondront à deux angles de rotation (les axes de rotation dépendront de lʼorientation de votre scène 3D). - le code suivant pourra être utilisé : void motion(int x, int y) {
! if (g_mouse_button == GLUT_RIGHT_BUTTON && g_mouse_state == GLUT_DOWN)! {!! g_angle_x += y - g_mouse_position_y;!! g_angle_y += x - g_mouse_position_x;!! g_mouse_position_x = x;!! g_mouse_position_y = y;! }! glutpostredisplay(); } - la routine dʼaffichage devient alors : void display() {! glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT);!! glpushmatrix();! glrotatef(g_angle_x, 1, 0, 0);! glrotatef(g_angle_y, 0, 1, 0);!!!! glpopmatrix();! glutswapbuffers(); } Ajoutez la normale à chaque carré. Ajoutez une source lumineuse ponctuelle (i.e. effet similaire à une ampoule). Vous pouvez, par exemple, utiliser le code suivant dans la fonction dʼinitialisation dʼopengl :! glenable(gl_normalize);! glenable(gl_light0);! GLfloat diffuse0[] = {1.0f, 1.0f, 1.0f, 1.0f};! GLfloat ambient0[] = {0.2f, 0.2f, 0.2f, 1.0f};! GLfloat specular0[] = {1.0f, 1.0f, 1.0f, 1.0f};! gllightfv(gl_light0, GL_AMBIENT, ambient0);! gllightfv(gl_light0, GL_SPECULAR, specular0);! gllightfv(gl_light0, GL_DIFFUSE, diffuse0); Attention, on a vu en cours que les sources lumineuses sont traitées comme des objets géométriques, elles sont donc transformées par la matrice de modélisation/visualisation. Vous devez donc spécifier la position de la source lumineuse dans la routine dʼaffichage, après les appels à glrotationf() qui permettent de tourner la scène 3D. Sans
plaquage de texture, on obtient :
En appliquant le plaquage de texture, on obtient : Lʼéclairage nʼest pas pris en compte car la couleur de chaque fragment correspond à un texel couleur dans la carte de texture.
Remplacez le mode dʼenvironnement de texture GL_REPLACE par GL_MODULATE. Vous obtenez une image similaire à : Lʼéclairage et le plaquage de texture sont combinés.
Transformez cette source lumineuse ponctuelle en projecteur (spot) avec un angle dʼouverture de 40 (!gllightf(gl_light0, GL_SPOT_CUTOFF, 20.0f);). Lʼaffichage ne permet pas dʼobserver le volume de lumière du spot. Pourquoi? (le calcul dʼéclairage est effectué uniquement pour chaque sommet. Puis les couleurs sont interpolées entre chaque sommet afin de remplir le polygone (ombrage de Gouraud)).
Ecrivez donc une fonction qui permette de subdiviser de manière isotrope chaque carré. Sans subdivision sans plaquage de texture ni éclairage.
14 subdivisions sans plaquage de texture ni éclairage.
14 subdivisions avec plaquage de texture et éclairage.
149 subdivisions sans plaquage de texture ni éclairage.
149 subdivisions avec plaquage de texture et éclairage.
Afin de rendre la scène plus réaliste, on ajoute gllightf(gl_light0, GL_SPOT_EXPONENT, 60.0f); afin de spécifier un coefficient d'atténuation angulaire.
Ajoutez une sphère et un segment de droite afin de visualiser respectivement la position et la direction du spot.
Ajoutez un extrait du code du TP4 afin dʼajouter votre robot :