1 / 20

OpenGL Programmation

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

yoshi-byers
Download Presentation

OpenGL Programmation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sébastien Kuntz Sebastien.kuntz@nowan.net Institut de Formation OpenGLProgrammation

  2. Programmation OpenGL • Plan • Glut • Glut : Exemple • Glut : Gerer les évenements • Dessiner en 3D • Animations & Depth Buffer OpenGL 1

  3. 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..

  4. 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

  5. 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 ); }

  6. 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

  7. 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.

  8. 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(); }

  9. 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; } }

  10. 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(); }

  11. 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

  12. 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

  13. 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

  14. 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; • }

  15. 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

  16. 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); }

  17. 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(); }

  18. Programmation OpenGL A vous de jouer!

  19. TP 1 • Exercice 1: Dessiner un triangle • Vous aurez besoin de : • glBegin() / glEnd() • glVertex3f(); • glColor3f(); • glTranslatef();

  20. 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

More Related