Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation OpenGL Programmation Sébastien Kuntz Institut de Formation
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation 1OpenGL Programmation OpenGL Plan Glut Glut : Exemple Glut : Gerer les évenements Dessiner en 3D Animations & Depth Buffer
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL Glut Programmation simplifiée Indépedant de l'OS Ne fait pas officiellement partit d'OpenGL Gestion des fenetres, clavier et souris Quelques primitives : Cube, sphere..
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programation OpenGL Structure d'un programme Glut : Configurer et ouvrir une fenêtre Initialiser OpenGL Enregistrer les fonctions de traitement d'évènement (callbacks) Fonction de rendu d'image Fonction de gestion de fenetre Interaction avec l'utilisateur : clavier, souris, etc.. Entrer dans la boucle de traitement d'évènements
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL Glut : Exemple void main( int argc, char** argv ){ glutInitDisplayMode( GLUT_RGB|GLUT_DOUBLE ); glutCreateWindow( OpenGL window ); initOpenGL(); glutDisplayFunc( display ); glutReshapeFunc( resize ); glutKeyboardFunc( key ); glutIdleFunc( idle ); glutMainLoop(); } void initOpenGL( void ) { glClearColor( 0.0, 0.0, 0.0, 1.0 ); glClearDepth( 1.0 ); glEnable( GL_LIGHT0 ); glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST ); }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Glut : Gerer les évenements La gestion se fait au moyen de callbacks Ce sont des fonctions qui sont appelées quand : Une fenetre est redimensionnée ou redessinée L'utilisateur agit sur le programme On veut animer un ou des objets
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut On enregistre les callbacks : glutDisplayFunc() : appelé quand des pixels d'une fenetre doivent etre rafraichis glutReshapeFunc(): appelé quand une fenetre change de taille glutKeyboardFunc(): appelé lors d'une frappe sur le clavier glutMouseFunc(): appelé lors d'un click sur la souris glutMotionFunc(): appelé lorsque l'utilisateur bouge la souris tout en appuyant sur un bouton glutPassiveMouseFunc(): appelé quand la souris bouge, quelque soit l'état des boutons glutIdleFunc(): appelé quand rien ne se passe. Très utile pour les animations.
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Le callback de rendu : C'est là qu'on dessine en 3D glutDisplayFunc( display ); void display( void ) { glClear( GL_COLOR_BUFFER_BIT ); glBegin( GL_TRIANGLE_STRIP ); glVertex3fv( v[0] ); glVertex3fv( v[1] ); glVertex3fv( v[2] ); glVertex3fv( v[3] ); glEnd(); glutSwapBuffers(); }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Entrées au clavier : glutKeyboardFunc( keyboard ); void keyboard( char key, int x, int y ) { switch( key ) { case q : case Q : exit( EXIT_SUCCESS ); break; case r : case R : rotate = GL_TRUE; break; }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Idle Callback Que faire quand rien il n'y'a pas d'évènements? Utilisé pour les animations ou les mises à jour fréquentes : glutIdleFunc( idle ); void idle( void ) { t += dt; glutPostRedisplay(); }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Animation et Depth Buffer Comment utiliser le Double Buffering pour les animations ? Comment utiliser le depth buffer pour éliminer les surfaces cachées
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Double Buffering et les animations Animation avec un seul buffer : scintillement Deux buffers identiques : Front et Back On rend l'image dans le Back Buffer, et on bascule l'affichage quand tout est prêt Les deux buffers sont interchangés : le Back Buffer est affiché, et le Front Buffer devient le nouveau Back Buffer
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL / Glut Comment utiliser le Double Buffering ? 1/ Demander un double buffe r glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE ); 2/ Efface le buffer d'affichage glClear ( GL_COLOR_BUFFER_BIT ); 3/ Rendre la scene 4/ Demander le basculement des Front & Back buffers glutSwapBuffers(); Répèter 2-4 pour faire l'animation
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL Le Depth Buffer Par défaut, OpenGL dessine les primitives dans l'ordre précisé Le Depth Buffer stocke une information de profondeur pour chaque pixel Pour chaque pixel d'une primitive à afficher : if ( pixel->z z ) { depthBuffer(x,y)->z = pixel->z; colorBuffer(x,y)->color = pixel->color; }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL Comment utiliser le Depth Buffer ? 1/ Demander un depth buffer : glutInitDisplayMode( GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH ); 2/ Activer le test avec le depth buffer : glEnable( GL_DEPTH_TEST ); 3/ Effacer le buffer d'affichage et le depth buffer : glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 4/ Rendre la scène 5/ Echanger le Front et Back buffer
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL Un modèle de programme : void main( int argc, char** argv ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow( OpenGL ); init(); glutDisplayFunc( display ); glutMainLoop(); } void init( void ) { glClearColor( 0.0, 0.0, 1.0, 1.0 ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL (Suite du modèle) void drawScene( void ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity() glBegin( … ); /* appels à glColor*() et glVertex*() */ glEnd(); glutSwapBuffers(); glutPostRedisplay(); }
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation Programmation OpenGL A vous de jouer!
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation TP 1 Exercice 1: Dessiner un triangle Vous aurez besoin de : –glBegin() / glEnd() –glVertex3f(); –glColor3f(); –glTranslatef();
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation TP 1 Exercice 2.1: Dessiner un cube Vous aurez besoin de : –glBegin() / glEnd() –glVertex3f() –glColor3f() –glTranslatef() Exercice 2.2 : Le faire tourner Exercice 2.3 : Rajouter des contrôles de caméra