200 likes | 393 Views
Sébastien Kuntz Sebastien.kuntz@nowan.net. I nstitut de F ormation. OpenGL Programmation. Programmation OpenGL. Plan Glut Glut : Exemple Glut : Gerer les évenements Dessiner en 3D Animations & Depth Buffer. OpenGL. 1. Programmation OpenGL. Glut Programmation simplifiée
E N D
Sébastien Kuntz Sebastien.kuntz@nowan.net Institut de Formation OpenGLProgrammation
Programmation OpenGL • Plan • Glut • Glut : Exemple • Glut : Gerer les évenements • Dessiner en 3D • Animations & Depth Buffer OpenGL 1
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..
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
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 ); }
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
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.
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(); }
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; } }
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(); }
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
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
Programmation OpenGL / Glut • Comment utiliser le Double Buffering ? 1/ Demander un double buffer 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
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 < depthBuffer(x,y)->z ) • { • depthBuffer(x,y)->z = pixel->z; • colorBuffer(x,y)->color = pixel->color; • }
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
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); }
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(); }
Programmation OpenGL A vous de jouer!
TP 1 • Exercice 1: Dessiner un triangle • Vous aurez besoin de : • glBegin() / glEnd() • glVertex3f(); • glColor3f(); • glTranslatef();
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