Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de...

Preview:

Citation preview

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

Introduction à OpenGL

Sébastien KuntzSebastien.kuntz@nowan.net

Institut de Formation

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL

1. Buts1. De la formation

2. De la séance

2. Introduction1. Présentation

2. Origine

3. Composants

3. OpenGL

1. Bases

2. Machine à état

3. Transformations

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

Buts

Buts de la formation

– Comprendre ce qu’est OpenGL– Comprendre les mécanismes de rendu 3d– Savoir écrire un programme 3d– Acquérir des bases pour être autonome

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

Buts

Buts de la séance

– Comprendre ce qu’OpenGL peut faire pour vous– Connaître les différents composants– Comprendre comment OpenGL gère la 3d

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL : Introduction / Présentation OpenGL : API de programmation 2D et 3D

Standard dans l'industrieCrée par Silicon GraphicsDeveloppé par l’Architecture Review Board

PerformanceSouplessePortabilitéEvolutivité et Stabilité de l’APIRobustesse

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL : Introduction / Composants

• Primitives géometriques – Points, lignes et polygones

• Primitives d’image – Images

– Pixels

• Le rendu de l’image dépend de l’état :– de la couleur

– des materiaux

– des sources lumineuses

– etc..

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL : Introduction / Composants OpenGL crée les images Fenêtres et E/S sont spécifiques à un OS

GLUT ( GL Utility ) : simple et portable SDL : Genre de DirectX Portable Api Windows, Api X

OpenGL est bas niveau Haut niveau construit par dessus OpenSceneGraph, GLU, Performer ..

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Les bases

1. Les bases• Un exemple simple• Syntaxe des fonctions• Primitives• Passons à la 3ème Dimension !

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Un exemple simple

1. Un exemple simple : Afficher un carré :

#include <whateverYouNeed.h>main() {   OpenAWindowPlease();   glClearColor(0.0, 0.0, 0.0, 0.0);   glClear(GL_COLOR_BUFFER_BIT);   glColor3f(1.0, 1.0, 1.0);   glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);    glBegin(GL_POLYGON);      glVertex2f(-0.5, -0.5);      glVertex2f(-0.5, 0.5);      glVertex2f(0.5, 0.5);      glVertex2f(0.5, -0.5);   glEnd();   KeepTheWindowOnTheScreenForAWhile();}

(OpenG

L R

ed Book)

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Syntaxe

Syntaxe des fonctions

Draw() {// 3 flottants pour une couleurglColor3f(1.0, 0.0, 0.0);

float color_array[] = {1.0, 0.0, 0.0};

// un vecteur de 3 flottantsglColor3fv(color_array);

// 2 entiersglVertex2i( 1, 3 )

// 3 doubles glVertex3d( 0.3214,

0.4321, 0.0 );

}

Exemple :

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Syntaxe

• OpenGL est une machine à états– Choisir un état :

• glPointSize( size );

• glColor3f( 1.0, 0.0, 0.0 );

• glLight..

– Activer ou désactiver des propriétés :• glEnable( GL_LIGHTING );

• glDisable( GL_TEXTURE_2D );

• L'affichage des primitives dépend de l'état courant de l'ensemble des attributs

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Axes & Repères

• Repérage dans l’espace– OpenGL définit ses axes par rapport à l’écran

y

xz

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Primitives

OpenGL fournit des primitives d'affichageLignes :

PolygonesDoivent etre simples :

✗ Pas convexes✗ ‘Sans trous'✗ Sur un seul plan

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Primitives

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Primitives

Comment utiliser ces primitives ?– la plus simple : glBegin / glEnd

glBegin(GL_POLYGON);   glVertex2f(0.0, 0.0);   glVertex2f(0.0, 3.0);   glVertex2f(3.0, 3.0);   glVertex2f(4.0, 1.5);   glVertex2f(3.0, 0.0);glEnd();

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Primitives

• Toutes les commandes ne sont pas valides dans glBegin/glEnd

• Commandes valides :– glVertex, glColor, glIndex*, glSecondaryColor,

glNormal, glMaterial, glFogCoord, glTexCoord, glMultiTexCoord, glEdgeFlag, glArrayElement, glEvalCoord, glEvalPoint, glCallList*

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Couleurs

• glColor( R,G,B {,A} )

glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f);   glVertex3f(0.0f, 0.0, 0.0); //A

glColor3f(0.0f, 1.0f, 0.0f);   glVertex3f(-1.0f, -1.0f, 0.0f); //B

glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); //CglEnd();

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / 3D• Passons à la 3ème dimension !

Un vertex, des vertices : un point en 3D

Vecteur Normal

Perpendiculaire à une surface

Définit son orientation

Une seule normale pour une surface plane

Surface quelconque: une normale par point

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases / Normales • Le rendu des lumières a besoin des normales

• Une normale par primitive ou par vertex : glNormal3f(x,y,z)

• Les normales DOIVENT etre unitaires

- Sans normales - - Avec normales -

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Bases

• Afficher un cubeglBegin(GL_QUADS);

Pour chaque face :

glColor3f(r,g,b);

glNormal3f( Nx, Ny, Nz );

glVertex3f( x1, y1, z1);

glVertex3f( x2, y2, z2);

glVertex3f( x3, y3, z3);

glVertex3f( x4, y4, z4);

Fin :

glEnd();

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGl / Bases / Display Lists• les Display Lists (D.L) permettent de stocker les commandes OpenGL pour de meilleures performances

GLuint list;void init( void ) {

list = glGenLists(1);glNewList( list, GL_COMPILE );glBegin( .. ); glVertex( .. ) ; ... glEnd();glEndList()

}

void display( void ) {glClear( GL_COLOR_BUFFER_BIT );glCallList( list );

}

– Une D.L. ne peut pas etre modifiée

– Possibilité d'encapsuler plusieurs niveaux de D.L.

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGl / Bases / Display Lists• Gluint glGenLists( Glsizei n )

– alloue n indices de D.L.

– retourne le nb d'indices crées

• glNewList( Gluint list, Glenum mode )

– précise le début d'une D.L.

– mode : GL_COMPILE, GL_COMPILE_AND_EXECUTE

• glEndList()

• glDeleteLists()

• glCallList( Gluint list )

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Plan– Fonctions de transformation– Exemple– Piles de matrices– Corrélation transformation / matrice– Comment afficher un point 3d sur un écran 2d ?– Opérations mathématiques– Opérations en OpenGL

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Fonctions de transformations• Déplacer un objet :

– glTranslate{fd}( x, y, z )

• Tourner un objet autour d’un axe– glRotate{fd}( angle, x, y, z )

• angle en degrés !

• Agrandir, retrécir ou inverser un objet:– glScale{fd}( x, y, z )

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Exemple

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslate(1.0,0.0,0.0);

DrawSphere();

glTranslate(1.0,0.0,0.0);

DrawCarre();

(0,0)(1,0) (2,0)

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Tout se passe comme si OpenGL change de repère• On dessine les objets par rapport à ce nouveau repère:

- effet d’une translation - - effet d’une rotation - - effet d’un redimensionnement -

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformation

• Corrélation transformations / matrices– Chaque transformation peut être représentée par une

matrice.

M translation

1 0 0 T x

0 1 0 Ty

0 0 1 T z

0 0 0 1

M rotation axe x

1 0 0 0

0 cos sin 0

0 sin cos 0

0 0 0 1

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations / Pile de matrices

• glPushMatrix, glPopMatrix– “sauvegarde” et “restitue” le repère courant

glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef( 1,0,0 );// sauvegarde la position actuelleglPushMatrix();drawCube();glTranslatef( 1,0,0 );drawSphere();// restitue la dernière//position sauvegardéeglPopMatrix();glTranslatef(0,1,0);drawTriangle();

• Sauvegarde dans une pile(0,0)

(1,0) (2,0)

(0,1)

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• HiérarchieglMatrixMode(GL_MODELVIEW);glLoadIdentity();glPushMatrix();glTranslate( x,y,z );drawCorps();

glMultMatrix( transf_bras );drawBras();

glMultMatrix( transf_avant_bras );

drawAvantBras();

glMultMatrix( transf_main );drawMain();glPopMatrix();

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Une matrice est associée au repère courant :– la matrice ModelView représente la transformation

du repère original vers le repère courant • Appliquer une transformation revient à multiplier la

matrice courante par la matrice de la transformation :// on va modifier la matrice du repèreglMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(1,0,0);glRotatef(90,1,0,0);

M ModelView=M Translation M Rotation

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• glTranslate, glRotate et glScale multiplient la matrice courante par la matrice associée à la transformation

• On peut créer une matrice à la main :– glLoadMatrixf(GLfloat* m);– glMultMatrixf(GLfloat* m);– !! Attention, les matrices sont stockées par colonne !!

• GLfloat m[16] = { a0, a1, … , a15 };

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Comment sont appliquées ces transformations?

• Calculer la position absolue d’un vertex :

P Absolu =M ModelView P Local

PTransformé =MTransformation P Local

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Exemple de transformations

– Translater un point :

– Translater puis tourner un point :

– Ce qui se traduit en OpenGl par :glMatrixMode(GL_MODELVIEW);glLoadIdentity();glRotatef(90,1,0,0);glTranslatef(1,0,0);draw_object();

P'=M Translation P

P'= M Rotation M Translation P

M Rotation M Translation P

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations• Deux façons de voir les transformations :

– Dans l’ordre indiqué, la multiplication des matrices modifie un repère local

• Les objets sont dessinés dans le repère local• Permet de mieux appréhender la hiérarchisation• Chaque matrice est une « matrice de changement de repère »

– Dans l’ordre opposé, la multiplication des matrices modifie la position, l’orientation ou la taille d’un objet

• Les objets sont dessinés dans un repère global fixe

• Le code est le même, il n’y’a que la façon de le voir

qui change

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Combiner transformations• Ordre des transformations

– Ordre critique !Multiplication de matrices non commutatif

glMatrixMode(GL_MODELVIEW);glLoadIdentity();/* translation */glTranslatef(1,0,0);/* rotation */glRotatef(45,0,0,1);draw_the_object();

glMatrixMode(GL_MODELVIEW);glLoadIdentity();/* rotation */glRotatef(45,0,0,1);/* translation */glTranslatef(1,0,0);draw_the_object();

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / 3d -> Ecran

Comment transformer un point en 3d pour l’afficher sur un écran 2d?

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Analogie avec un appareil photo– Positionner et orienter l’appareil

• Viewing transformation

– Placer les objets qu’on veut photographier• Modeling transformation

– Choisir une lentille et/ou ajuster le zoom• Projection transformation

– Choisir la taille de la photo développée• Viewport transformation

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

•Analogie avec un appareil photo

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Opérations mathématiques :

Chaque transformation correspond à un changement de repère

Repère de l’objet

Matrice de l’objet( model matrix )

Repère du monde

Matrice œil( View matrix )

Repère de l’oeil( caméra )

Matrice de Projection( projection matrix )

Repère de l’écran 2D

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Opérations en OpenGL :– La model matrix et la view matrix sont combinées:

• Bouger la camera est équivalent à bouger chaque objet dans l’autre sens

ModelView Matrix

– glMatrixMode permet de choisir la matrice courante• GL_PROJECTION, GL_MODELVIEW, GL_TEXTURE

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations / Projection

• La matrice de projection définit la forme du frustum• Perspective projection

– gluPerspective( FOVy, aspect, zNear, zFar )

– glFrustum( left, right, bottom, top, zNear, zFar )

• Orthographic parallel projection– glOrtho( left, right, bottom, top, zNear, zFar)

– gluOrtho2D( left, right, bottom, top )

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations• Préparer la scène :// On va choisir la matrice de projectionglMatrixMode( GL_PROJECTION ); // et on la spécifieglOrtho( left, right, bottom, top, near, far ); ouglFrustum( left, right, bottom, top, near, far );

// On informe OpenGL qu’on va modifier la modelview matrix// et on choisit une transformation pour la caméraglMatrixMode( GL_MODELVIEW );// On place la caméragluLookAt()

// On combine ici les transformations qui placent les objets dans le monde 3d// Pour combiner des transformations elles sont multipliéesglMultMatrixf( modelMatrix );

// Les points içi sont dans le repère de l’objet (état original)// (model space)

© Tim Hall

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Transformations

• Placer les objets// On va modifier la matrice ModelViewglMatrixMode( GL_MODELVIEW );

// On charge la transformation de la caméraglLoadMatrixf( viewingMatrix );

// On fait une itération sur les modèles.// Pour chaque modèle on sauve la matrice courante// et on y applique la matrice du modèle// On dessine le modèle et on restaure la matrice sauvéefor( model = firstModel; model != NULL; model = nextModel ) {

glPushMatrix( );// On combine la transformation de l’objet avec// la matrice de vueglMultMatrixf( model->modelMatrix );// On affiche l’objetDrawModel( model );// On restaure la matrice sauvéeglPopMatrix( );

}

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL

Questions? Commentaires?

Tous droits réservés. R

eproduction intégrale ou partielle interdite sans autorisation écrite de la part du titulaire des droits d’auteur.

Institut de Formation

OpenGL / Links

• Liens utiles :– Site officiel

• www.opengl.org

– Tutoriaux• Nehe.gamedev.net

– Références :• http://fly.cc.fer.hr/~unreal/theredbook/ : le Red Book • http://www.eecs.tulane.edu/www/graphics/doc/OpenG

L-Man-Pages/opengl_index_spec.html : le Blue Book

Recommended