Académique Documents
Professionnel Documents
Culture Documents
GUIDE DE
À LA PROGRAMMATION GRAPHIQUE EN
1. PRÉAMBULE ....................................................................................................................................................................... 4
1.1. RÉFÉRENCES ....................................................................................................................................................................... 4
1.1.1. Livres et Manuels .................................................................................................................................................... 4
1.1.2. Sites Web ................................................................................................................................................................ 4
2. LES BIBLIOTHÈQUES............................................................................................................................................................ 4
2.1. GRAPHIC LIBRARY (GL)......................................................................................................................................................... 5
2.2. OPENGL (GL) .................................................................................................................................................................... 5
2.3. OPENGL UTILITY LIBRARY (GLU) ............................................................................................................................................ 5
2.4. OPENGL UTILITY TOOLKIT (GLUT)........................................................................................................................................... 5
2.5. DIVERS .............................................................................................................................................................................. 6
2.6. ORGANISATION DES BIBLIOTHÈQUES (GL, GLU, GLUT) .................................................................................................................. 6
2.6.1. Moteur géométrique (geometric engine) ............................................................................................................... 6
2.6.2. Moteur de numérisation (raster engine) ................................................................................................................ 7
2.6.3. Gestionnaire de numérisation (raster manager) .................................................................................................... 7
2.7. FONCTIONS ET CONSTANTES .................................................................................................................................................. 7
2.7.1. Syntaxe des fonctions et des constantes ................................................................................................................ 7
2.7.2. Fonctions de création (ou Primitives graphiques) .................................................................................................. 7
2.7.3. Fonctions entre begin et end .................................................................................................................................. 9
2.7.4. Autres primitives ................................................................................................................................................... 10
3. CRÉATION ET MANIPULATION DES SCÈNES ...................................................................................................................... 11
3.1. CRÉATION DE LA VUE À VISUALISER........................................................................................................................................ 11
3.2. PRÉSENTATION DES MATRICES D’OPENGL............................................................................................................................... 13
3.3. TRANSFORMATIONS ........................................................................................................................................................... 14
3.3.1. Principes ............................................................................................................................................................... 14
3.3.2. Positionnement des objets (transformations élémentaires)................................................................................. 14
3.4. PILE DES MATRICES ............................................................................................................................................................ 15
3.5. MATRICE « GL_MODELVIEW » (SPÉCIFICATION DU POINT DE VISION) ................................................................................ 15
3.5.1. Positionnement de la caméra ............................................................................................................................... 15
3.5.2. Positionnement de la scène et ses objets ............................................................................................................. 16
3.6. MATRICE « GL_PROJECTION » (PROJECTION ET FENÊTRAGE) .......................................................................................... 16
3.6.1. Projections prédéfinies ......................................................................................................................................... 16
3.6.2. Exemple d’utilisation ............................................................................................................................................ 18
3.7. GESTION DES ENTRÉES (GLUT) .............................................................................................................................................. 18
3.7.1. Le clavier ............................................................................................................................................................... 18
3.7.2. La souris ................................................................................................................................................................ 19
3.7.3. Liste des boutons pour les trois fonctions ............................................................................................................. 19
3.7.4. divers .................................................................................................................................................................... 19
3.7.5. Exemple ................................................................................................................................................................ 19
4. ORGANISATION D’UN PROGRAMME GRAPHIQUE ............................................................................................................ 20
4.1. ÉTAPES DE PROGRAMMATION .............................................................................................................................................. 20
4.2. INITIALISATION .................................................................................................................................................................. 20
4.2.1. Initialisation des états de glut .............................................................................................................................. 20
4.2.2. Initialisation des Paramètres du dessin (ou des variables d’états) ....................................................................... 21
4.3. DÉFINITION DE LA MATRICE « GL_MODELVIEW »........................................................................................................... 23
4.4. DÉFINITION DE LA MATRICE « GL_PROJECTION » ......................................................................................................... 23
4.5. DÉFINITION DES OBJETS À DESSINER ...................................................................................................................................... 23
4.6. GESTION DES ÉVÉNEMENTS (LES CALL-BACKS)......................................................................................................................... 23
4.7. LES BUFFERS (OU PLANS MÉMOIRE) ...................................................................................................................................... 23
4.7.1. Les buffers............................................................................................................................................................. 23
4.7.2. Utilisation ............................................................................................................................................................. 24
4.7.3. Effacement des buffers ......................................................................................................................................... 24
4.8. PROGRAMMES D’ILLUSTRATION............................................................................................................................................ 24
4.8.1. Squelette d’un programme................................................................................................................................... 24
4.8.2. programme 1 : initialisation, polygone et interpolation des couleurs ................................................................. 25
4.8.3. programme 2 : cube, projections et rotations ...................................................................................................... 25
4.8.4. programme 3 : touches spéciales : rotations par flèches .................................................................................... 26
infographie avec opengl 3
4.8.5. programme 4 : lumières et animation .................................................................................................................. 27
4.9. GESTION D'UN PROCESSUS EN TÂCHE DE FOND ........................................................................................................................ 28
4.9.1. Utilisation de la fonction ...................................................................................................................................... 28
4.9.2. Programme 5 : animation en tâche de fond ....................................................................................................... 28
4.10. LES LISTES D'AFFICHAGE .................................................................................................................................................. 29
4.10.1. Définition .............................................................................................................................................................. 29
4.10.2. Syntaxe des commandes ...................................................................................................................................... 29
4.10.3. Exemple ................................................................................................................................................................ 30
4.11. LE BROUILLARD ............................................................................................................................................................. 31
4.11.1. Mise en œuvre ...................................................................................................................................................... 31
4.11.2. Exemple ................................................................................................................................................................ 31
4.12. PROGRAMME D’ILLUSTRATION DE L’ILLUMINATION .............................................................................................................. 33
5. ÉLIMINATION DES PARTIES CACHÉES ................................................................................................................................ 34
5.1. ALGORITHME DE LA NORMALE (CULLING)................................................................................................................................ 34
5.1.1. Principe ................................................................................................................................................................. 34
5.1.2. Mise en œuvre par Opengl ................................................................................................................................... 34
5.1.3. Remarques ............................................................................................................................................................ 34
5.2. ALGORITHME DU Z-BUFFER (DEPTH-BUFFER) ....................................................................................................................... 34
5.2.1. Principe et Implantation ....................................................................................................................................... 34
5.2.2. Avantages ............................................................................................................................................................. 35
5.2.3. Inconvénients........................................................................................................................................................ 35
5.2.4. Mise en œuvre par Opengl ................................................................................................................................... 35
5.3. EXEMPLES DE PROGRAMMATION .......................................................................................................................................... 35
5.3.1. programme 6: z_buffer ........................................................................................................................................ 35
6. ANNEXES .......................................................................................................................................................................... 37
6.1. TYPES PRÉDÉFINIS .............................................................................................................................................................. 37
6.2. MASQUES DU MODE D’AFFICHAGE........................................................................................................................................ 37
6.3. LISTE DES FONCTIONS OPENGL, GLU ET GLUT ........................................................................................................................... 37
6.3.1. Bibliothèque gl ...................................................................................................................................................... 37
6.3.2. Bibliothèque glu .................................................................................................................................................... 38
6.3.3. Bibliothèque glut .................................................................................................................................................. 39
6.4. DIVERS ............................................................................................................................................................................ 40
6.4.1. versions et informations ....................................................................................................................................... 40
6.4.2. prochaine versions du document ........................................................................................................................ 40
infographie avec opengl 4
1. PRÉAMBULE
Ces notes de cours sont conçues dans le but d’aider les lecteurs à apprendre, dans des
délais raisonnables, la programmation d’applications graphiques en Opengl. Lors de la
réalisation de ce document nous avons consulté une série de références et de pages web
officielles ou écrites par des développeurs et utilisateurs de ladite bibliothèque.
Le nombre de documents, sous forme de manuels officiels, Livres ou de pages web, est très
important. Une liste non exhaustive de ces références est présentée à la section suivante.
Des sujets, plus spécialisés, seront traités dans le cadre d’autres cours. Ainsi, la
modélisation géométrique et l’élimination des parties cachées seront introduites au cours
d’infographie et détaillée au cours CAO. D’autres sujets feront l’objet d’autres cours : les
maillages, la triangulation, …, etc.
Le choix d’Opengl n’est pas fortuit. La bibliothèque est un standard de fait pour les
développeurs d'applications CAO et des jeux. La bibliothèque est conçue pour permettre la
création des scènes 3D en offrant des possibilités d’animation, de modifications, de rendu
réaliste, ..., etc. Des applications, de renommées, conçues autour d’Opengl, sont
nombreuses et diversifiées.
Plusieurs logiciels de différents domaines sont développés sous OpenGL:
• Modélisation géométrique et CAO : Catia, SolidWorks, Pro-Engineer, ...
• Création et animation 3D : Maya, 3DSMax, Softimage, Blender…
• Jeux Vidéos (micro-ordinateur, console) : Quake, Unreal 2, Half-life, Doom 3 …
OpenGl est aussi de plus en plus compatible avec le matériel (cartes graphiques,
imprimantes, …). Parmi les cartes citons : la Geforce4 de Nvidia, la Radeon 8500 d'ATI, …
1.1. RÉFÉRENCES
1.1.1. Livres et Manuels
• Une liste assez étouffée, de références, est consultable sur le site officiel : http://www.opengl.org
• OpenGL, programming guide the official guide to learning OpenGL Jackie Neider - Tom Davis -
Mason Woo OpenGL architecture review board Addison Wesley ISBN 0-201-63274-8
• OpenGL, reference manual the official reference document OpenGL architecture review board
Addison Wesley ISBN 0-201-63276-4
2. LES BIBLIOTHÈQUES
La bibliothèque de base est complétée par d’autres bibliothèques complémentaires. Dans
cette section, nous donnons les caractéristiques et les fonctionnalités de bibliothèques.
Seules les bibliothèques utilisables sans licence, parmi les plus utilisées, seront présentées.
infographie avec opengl 5
2.1. GRAPHIC LIBRARY (GL)
• Bibliothèque ou interface propriétaire (IRIS GL) développée par Silicon Graphics Inc
(SGI). Son utilisation est soumise à la licence de SGI
• Ancêtre d’Opengl, la bibliothèque GL avait ses propres commandes de fenêtres et de
pilotes de périphériques qui étaient spécifiques à IRIX (OS UNIX de SGI)
• Elle dépend ainsi du système de fenêtrage et par conséquent du matériel.
1
Annoncée le 11 août 2008 http://www.opengl.org/
infographie avec opengl 6
gestion de l’environnement multi-fenêtrage, la gestion des menus pop-up, la gestion
des périphériques d'entrée (souris, clavier, joystick, …), …
• Ses développeurs (cf. site officiel Opengl) l’ont conçue pour que le code source soit
portable à toutes (ou presque) les plates-formes dont les systèmes d’exploitation sont
à base du système X-Window (Mac, Ms Windows, …). GLUT est indépendante du
système de fenêtrage.
• Elle a été implémentée sur d’autres systèmes de fenêtrage autre que le système X-
Window tel que OS/2 et Mac OS. Cependant, ces versions ne font pas partie de la
distribution officielle
• GLUT remplace l’ancienne bibliothèque GLAUX (cf. divers ci-dessous)
• Elle contient les bibliothèques GL, GLU et d’autres fonctions. Ainsi, lors de
l’élaboration d’un programme il suffit d’appeler glut.
• Elle est considérée comme une interface utilisateur plus élaborée. Elle peut être
utilisée avec différents langages : C++ (et C), FORTRAN et Ada
• le développement est à la version 3. Glut3 sera utilisée dans ce cours (la dernière
version 3.7 de GLUT date de novembre 2001)
• Comme Opengl, elle est libre d’utilisation et elle est distribuée gratuitement
2.5. DIVERS
• glu et glut sont les bibliothèques complémentaires les plus utilisées.
• Autres bibliothèques : glaux (Auxiliary Library), glui (extension de glut), …
• BRIAN Paul, un développeur très actif, a implanté une bibliothèque compatible et
similaire à OpenGL sous linux sous la dénomination mesa (cf. site mesa3d)
• Le développement d’applications en 3D est facilité par des bibliothèques plus
élaborées telles que « Open Inventor ». Elle facilite la modélisation des scènes et la
modélisation géométrique.
Remarques
• Si le nombre de points n’est pas suffisant pour construire l’objet indiqué par la variable
« code », les derniers points non utilisés seront ignorés. Par exemple, si le nombre de
points est cinq (0, 1, 2, 3, 4) et le code est « GL_TRIANGLES », le résultat sera le
triangle (0-1-2-0) et les points (3 et 4) seront ignorés.
• Avec l’option « GL_POLYGON», aucune primitive ne sera créée si le nombre de points
est inférieur à 3.
• Seul le traitement des polygones convexes est garanti par Opengl et surtout lors de la
création du rendu réaliste.
2.7.3. Fonctions entre begin et end
Liste
Pour les entités créées entre begin et end, d’autres propriétés, peuvent être attribuées à
chaque entité graphique en plus des coordonnées des sommets. Ces informations sont
spécifiées par fonctions spécifiques. Parmi les commandes qui peuvent être appelée entre
begin et end, les plus importantes sont:
Fonction signification
glVertex*() Coordonnées d'un sommet (cf. § vertex ci-dessus)
glColor*() Couleur de tracé (cf. § couleur ci-dessous)
glIndex*() Indexe de couleur de tracé
glNormal*() Vecteur normal à un sommet
glEvalCoord*() ; glEvalPoint*() Génération de coordonnées de la courbe activée
glCallList() ; glCallLists() Appel des listes d'affichage (cf. § liste d’affichage)
glTexCoord*() Coordonnées d'une texture
glMaterial*() Propriété du matériau d'un objet
glFogCoord*() Coordonnées du fog
La couleur
Opengl offre deux modes de spécification de la couleur : le mode RGB ou le mode indexé
(table des couleurs indexées).
Si le mode RGB est activé, la couleur du tracé est définie par la spécification des
composantes rouge, verte et bleue. La spécification est réalisée par l’appel de l’une des
fonctions suivantes selon le nombre et la nature des arguments passés à la fonction :
void glColor{3,4}{b s i f d ub us ui} {v ou rien} ( r, v, b, alpha);
Les arguments (r, v, b, alpha) (ou en terme de pointeur v) correspondent aux valeurs des
composantes red, green, blue et/ou du mélange alpha.
La valeur alpha (valeur de diffusion du matériau) du code RGBA correspond à la technique
du mélange alpha qui consiste à combiner la couleur d'un fragment en cours de traitement
avec celle d'un pixel déjà stocké dans le tampon d'image. Le paramètre alpha peut être
considéré comme un facteur d’opacité ou de transparence de l’objet (alpha=1 : objet
totalement opaque, alpha=0 : objet totalement transparent). Un exemple qui peut être
cité est l’affichage d’un objet derrière une vitre d’une autre couleur. Si la couleur de la
infographie avec opengl 10
vitre est bleue et celle de l’objet est rouge. Le mélange Alpha permet de simuler la
transparence de la vitre. L’objet affiché, vu à travers la vitre, aura la couleur violette
La couleur choisie est active pour tous les objets crées après l’appel de la fonction
glColor*(…) jusqu'au nouvel appel de la même fonction avec une autre couleur. La couleur
choisie n’est utilisée que si la gestion des lumières et des matériaux n'est pas active
valeurs des arguments RGB des
couleurs les plus courantes
R G B Couleur
0.00 0.00 0.00 Noir
0.00 0.00 1.00 Bleu
0.00 1.00 0.00 Vert
0.00 1.00 1.00 Bleu clair (cyan)
1.00 0.00 0.00 Rouge
1.00 0.00 1.00 Violet (magenta)
1.00 1.00 0.00 Jaune
1.00 1.00 1.00 Blanc
0.50 0.50 0.50 Gris
0.25 0.25 0.25 Gris clair
0.75 0.75 0.75 Gris foncé
La normale
Lors de la création d’une facette ou d’une surface, il est possible de définir la normale au
niveau de chaque sommet (vertex). Elle est utilisée pour les calculs d'éclairage. La
normale définie devient la normale courante. Elle n’est modifiée que par un autre appel.
La définition est effectuée par l’une des fonctions :
void glNormal3{bsidf}(x, y, z); ou void glNormal3{bsidf}v( *v);
Cet appel attribue à la normale courante le vecteur passé en argument sous forme de
composantes (x, y, z) ou sous forme de pointeur v. S’elle n’est pas spécifiée, sa valeur
prise par défaut égale au vecteur (0.0, 0.0, 1.0).
Exemple
Ces lignes de programme permettent de créer un polygone plein avec une couleur donnée
à chaque sommet. La bibliothèque s’occupe de l’interpolation des couleurs entre les
sommets.
void dessin() {
glBegin(GL_POLYGON);
glColor3f (1.0, 0.0, 0.0); glVertex3f( 1.0, 0.5, 0.);
glColor3f (0.0, 1.0, 0.0); glVertex3f( 0.0, 1.0, 0.);
glColor3f (0.0, 0.0, 1.0); glVertex3f(-1.0, 0.5, 0.);
glColor3f (1.0, 1.0, 1.0); glVertex3f(-1.0,-0.5, 0.);
glColor3f (1.0, 1.0, 0.0); glVertex3f( 0.0,-1.0, 0.);
glColor3f (0.0, 1.0, 1.0); glVertex3f( 1.0,-0.5, 0.);
glEnd();}
Transformation de projection et
spécification du volume visualisé
Matrice (GL_PROJECTION) (Mp)
modifiable par l’utilisateur
Spécification de l’objet projeté Repère de la caméra (ou position l’observateur)
et fenêtrage XP = (x, y, z, w)
X =M X →X =M X →X =M X →X =M X
v
v
o p
p
v n
n
p w
w
n
Soit
X =M M M M X
w
w n p v
o
3.3. TRANSFORMATIONS
3.3.1. Principes
Les transformations sont appliquées selon les principes fondamentaux suivants :
• La transformation affecte tous les objets définis après l’appel de la fonction
correspondante. Les objets déjà crées (ou définis) ne subiront aucune transformation.
• Les transformations effectuent un changement du repère courant. Il faut en tenir
compte lors de la composition des transformations. Par exemple, si on effectue une
rotation autour de l'axe x suivie d’une rotation autour de l'axe y, cette dernière
s'effectuera autour du nouvel axe y modifié par la première rotation.
3.3.2. Positionnement des objets (transformations élémentaires)
Le positionnement et l’animation des objets d’une scène ou de la scène elle-même sont
réalisés par différentes transformations géométriques. En Opengl plusieurs transformations
affines élémentaires sont prédéfinies et programmées en fonctions :
• void glRotate{f, d} (angle, xd, yd, zd) : l’appel de cette fonction, permet de multiplier la
matrice active par la matrice d’une rotation d’angle « angle » (en degré) autour de l’axe
passant par l’origine du repère courant et de direction le vecteur (xd, yd, zd)
• void glTranslate{f, d}(tx, ty, tz) : l’appel de cette fonction, multiplie la matrice active par
la matrice de la translation de vecteur (tx, ty, tz).
• void glScale{f, d}(cx, cy, cz) : multiplie la matrice courante par la matrice du
changement d’échelle de coefficients (cx, cy, cz) et de centre l’origine du repère courant.
• void glLoadMatrix(pointeur_matrix_user) : comme il a été mentionné précédemment,
cette fonction permet de spécifier la transformation directement par sa matrice. Avec
infographie avec opengl 15
cette technique on peut définir n’importe quelle transformation sans garantie qu’elle
soit affine.
Remarques
l’appel de la fonction doit suivre l’activation de la matrice (GL_MODELVIEW)
les neuf coordonnées sont exprimées dans le repère d’origine (espace utilisateur)
l’appel à cette fonction se fait en général au début de la création
Exemple
infographie avec opengl 16
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
gluLookAt(xcam, ycam, zcam, xvise, yvise, zvise, xup, yup, zup)
3.5.2. Positionnement de la scène et ses objets
Le positionnement des objets est effectué à l’aide de la matrice de modélisation et de
visualisation (GL_MODELVIEW). Cette matrice est modifiable par les matrices
correspondant aux transformations géométriques décrites précédemment. L’exemple ci-
dessous indique une manière d’opérer la modification en faisant subir au repère d’origine
les transformations suivantes : une translation; 2 rotations.
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glTranslate(vx, vy, vz);
glRotate(ax, 1., 0., 0.);
glRotate(ay, 0., 1., 0.);
• La matrice est d’abord initialisée à l’identité et ensuite multiplier par les matrices les
transformations spécifiées.
• L’ordre de l’appel est très important car le produit matriciel n’est pas commutatif.
3.7.1. Le clavier
La gestion du clavier dépend de la nature de la touche utilisée. La bibliothèque glut
distingue deux types de touches : les touches simples (code ascii) et les touches spéciales
(touches de fonctions f1, f2, …, les flèches, Ctrl, Alt, …).
La fonction glutKeyboardFunc(), fonction de glut, indique la fonction utilisateur, reçue
comme argument, de gestion du clavier qui sera utilisée. Cette dernière doit être
développée et nommée par l’utilisateur. Son entête prend la forme : void
my_keyboardfunc(unsigned char key, int x, int y). Elle retourne le code ASCII de la touche
enfoncée dans la variable key et la position (x, y) de la souris. Lors de son écriture, il est
impératif que les arguments soient de la forme (unsigned char key, int x, int y).
infographie avec opengl 19
La fonction glutSpecialFunc() indique la fonction utilisateur, reçue comme argument, de
gestion des touches spéciales qui sera utilisée. Comme pour les touches simples, cette
dernière doit être développée et nommée par l’utilisateur. L’entête prend la forme : void
my_specialKeysFunc(int key, int x, int y). Elle retourne le code de la touche spéciale
enfoncée dans la variable key et la position (x, y) de la souris. Les arguments de la
fonction doivent, obligatoirement, prendre la forme : (int key, int x, int y).
3.7.2. La souris
La gestion des actions liées à l’utilisation de la souris est effectuée par plusieurs fonctions :
• glutMouseFunc() : Cette fonction de glut indique la fonction utilisateur appelée lorsqu'un
bouton de la souris est enfoncé ou relâché. La fonction utilisateur doit, obligatoirement,
avoir les arguments (int button, int state, int x, int y), où
button = {GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON} indique si le
bouton de la souris indiqué par la variable est enfoncé
state = {GLUT_UP ou GLUT_DOWN} indique l’état du bouton relâché ou enfoncé
x et y les coordonnées du curseur de la souris dans le repère de la fenêtre d’affichage
• glutPassiveMotionFunc() : Elle spécifie la fonction utilisateur appelée lorsque la souris
bouge. Les arguments de cette fonction utilisateur sont du type (int x, int y), où x et y
sont les coordonnées du curseur de la souris.
• glutMotionFunc() : même fonctionnalité que la fonction précédente, sauf que la fonction
utilisateur ne sera appelée que si la souris bouge et qu'un bouton est enfoncé
• glutEntryFunc() : Cette fonction, rarement utilisée, indique la fonction utilisateur à
appeler lorsque la souris sort ou entre dans la fenêtre d’affichage. La fonction utilisateur
ne reçoit qu'un paramètre, de type int, qui vaut GLUT_LEFT si la souris sort de la fenêtre
et GLUT_ENTERED si la souris entre dans la fenêtre.
3.7.3. Liste des boutons pour les trois fonctions
Dans le tableau ci-dessous nous donnons les valeurs de la variable key (ou autre dans le
cas de la souris) retournées lors de l’appel des fonctions de gestion du clavier et de la
souris
glutKeyboardFunc() glutSpecialFunc() glutMouseFunc()
code ASCII des GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_LEFT_BUTTON
touches du clavier GLUT_KEY_F4, GLUT_KEY_F5, GLUT_KEY_F6 GLUT_MIDDLE_BUTTON
GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_RIGHT_BUTTON
GLUT_KEY_F10, GLUT_KEY_F11, GLUT_KEY_F12 et
GLUT_KEY_LEFT, GLUT_KEY_RIGHT,
GLUT_DOWN, GLUT_UP
GLUT_KEY_UP, GLUT_KEY_DOWN,
GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN,
GLUT_KEY_HOME, GLUT_KEY_END,
GLUT_KEY_INSERT
3.7.4. divers
• glutGetModifiers() : Est une fonction d'état qui sert à détecter si les touches Ctrl, Alt ou
Shift sont enfoncées. Il ne faut l'appeler que dans une fonction utilisateur de gestion
du clavier ou de la souris. Elle ne nécessite aucun paramètre et renvoie un entier (int)
qui peut prendre l’une des valeurs {GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL,
GLUT_ACTIVE_ALT}.
• Autres dispositifs : La bibliothèque glut contient des fonctions pour gérer les entrées
par d’autres dispositifs tels que : les joysticks, les tablettes graphiques, …
3.7.5. Exemple
Nous donnons ci-dessous un exemple d’utilisation de la fonction de gestion des touches
spéciales. La fonction utilisateur permet de modifier l’angle de rotation autour de l’un des
axes selon la touche flèche enfoncée. Ces angles seront utilisés au niveau de la fonction de
infographie avec opengl 20
création de l’objet. Cet exemple sera repris ultérieurement (cf. Exemples de
programmation)
4.2. INITIALISATION
4.2.1. Initialisation des états de glut
Fonctions
Lors de l’utilisation de la bibliothèque glut, l’initialisation est effectuée par la fonction :
void glutInit(int **argcp, char **argv);
argcp un pointeur vers une variable de main non modifiable
argv variable de main non modifiable
Elle se charge d’initialiser les variables d’états de glut. Notons que seules les fonctions
préfixées par glutInit peuvent la précéder. Il est vivement conseillé de l’appeler la
première.
Pour ne pas utiliser les valeurs par défaut, d’autres variables de l’environnement de
réalisation de l’image peuvent être initialisées. Parmi les fonctions d’initialisation, fournies
par la bibliothèque, et les plus utilisées, citons :
• void glutInitWindowPosition(int x, int **y); permet de positionner la fenêtre d’affichage
en spécifiant les coordonnées de son coin supérieur gauche (x, y) par rapport au coin
supérieur gauche de l’écran. Notons que pour la bibliothèque glut, l’origine de l’écran
est au coin supérieur gauche et que pour Opengl il est au coin inférieur gauche.
infographie avec opengl 21
• void glutInitWindowSize(int width, int **height); spécifie la taille (largeur et hauteur) de
la fenêtre d’affichage ((width, height en pixel)
• void glutInitDisplayMode(unsigned int mode); permet d’initialiser le mode d’affichage
défini par la valeur du masque mode. Plusieurs valeurs, séparées par le caractère
«|», peuvent être spécifiées lors de l’appel de la fonction. Les valeurs du masque sont
données en annexe (exemple : mode des couleurs : RGBA ou mode indexée, les
tampons mémoires, …).
• int glutCreatWindow(char *string) : crée une fenêtre avec les paramètres spécifiés par
les fonctions précédentes. Elle renvoie un identifiant unique identifiant la fenêtre
créée. la fenêtre ne sera affichée qu’après l’appel de glutMainLoop()
Exemple
La fonction main prend la forme :
int main(int argc, char **argv) ;
int windowname;
Le premier appel est celui de la fonction d’initialisation de la bibliothèque
glutInit(&argc, argv);
suivi d’appels de fonctions d’initialisation
glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(sizex, sizey);
windowname = glutCreateWindow(" dessin rectangle ");
Nous conseillons de les rassembler dans une fonction utilisateur dédiée à l’initialisation et
de déclarer la variable windowname comme une variable globale. Elle contient le nom de la
fenêtre d’affichage qui servira à la gestion de celle-ci (redimensionnement, fermeture, …).
La variable peut être omise et le dernier appel devient :
glutCreateWindow(" dessin rectangle ");
glutReshapeFunc(reshape);
glutDisplayFunc(affichage);
infographie avec opengl 25
glutIdleFunc(tache_fond);
glutMainLoop(); /* boucle des évènements */
return 0; }
#include <GL/glut.h>
int sizex, sizey, ortho = 1;
float rX=20, rY=40; /* angles de rotation initiales*/
void affichage ();
void Reshape(int width, int height);
void rotationParFleche(int k, int x, int y);
void affichage () {
glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef((GLfloat)rX, 1.0, 0.0, 0.0); glRotatef((GLfloat)rY, 0.0, 1.0, 0.0); /* rotations de repère local */
dessin(); /* tracer la scène cube */
glPopMatrix();
glFlush(); glutSwapBuffers();}
void rotationsparfleches(int k, int x, int y) { /* fonction définissant l'action des touches speciales */
switch(k) {
infographie avec opengl 27
case GLUT_KEY_UP: rX = (rX+5) % 360; break; /* vers le haut */
case GLUT_KEY_DOWN: rX = (rX-5) % 360; break; /* vers le bas */
case GLUT_KEY_RIGHT: rY = (rY+5) % 360; break; /* vers la droite */
case GLUT_KEY_LEFT: rY = (rY-5) % 360; break; /* vers la gauche */
default: break;}
glutPostRedisplay(); } /* actualisation de l'affichage */
#include <GL/glut.h>
int rx = 0, ry = 0, rz = 0;
static float blanc[]={1.0,1.0,1.0,1.0}; static float jaune[]={1.0,1.0,0.0,1.0};
static float cyan[]={0.0,1.0,1.0,1.0}; static float magenta[]={1.0,0.0,1.0,1.0};
static float rouge[]={1.0,0.0,0.0,1.0}; static float rougetransparent[]={1.0,0.0,0.0,0.1};
static float vert[]={0.0,1.0,0.0,1.0}; static float bleu[]={0.0,0.0,1.0,1.0};
static float noir[]={0.0,0.0,0.0,1.0}; static float grisTresFonce[]={0.1,0.1,0.1,1.0};
static float grisFonce[]={0.25,0.25,0.25,1.0}; static float grisMoyen[]={0.5,0.5,0.5,1.0};
static float grisClair[]={0.75,0.75,0.75,1.0}; static float jauneClair[]={0.75,0.75,0.0,1.0};
static float jauneFonce[]={0.5,0.5,0.0,1.0}; static float cyanonce[]={0.0,0.5,0.5,1.0};
static float magentaFonce[]={0.5,0.0,0.5,1.0}; static float rougeFonce[]={0.5,0.0,0.0,1.0};
static float vertFonce[]={0.0,0.5,0.0,1.0}; static float bleuonce[]={0.0,0.0,0.5,1.0};
static float brun[]={0.8,0.6,0.4,1.0}; static float rose[]={1.0,0.65,0.65,1.0};
static float roseFonce[]={0.6,0.25,0.25,1.0}; static float bleuCiel[]={0.5,0.5,1.0,1.0};
static float bleuCielFonce[]={0.25,0.25,0.5,1.0};
void idle(void) { rx= (rx + 1) % 360; ry= (ry - 1) % 360; rz= (rz - 1) % 360; glutPostRedisplay() ; }
#include <GL/glut.h>
int sizex, sizey, ortho = 1, solid = 0;
int rX = 0, rY = 0; /* angles initiales des rotations*/
void affichage ();
void Reshape(int width, int height);
void rotationxy();
void affichage () {
glClearColor(1., 1., 1., 1.);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef((GLfloat)rX, 1.0, 0.0, 0.0); /* faire tourner le repère local autour de l'axe x */
glRotatef((GLfloat)rY, 0.0, 1.0, 0.0); /* faire tourner le repère local autour de l'axe y */
dessin(); /* tracer le cube */
glPopMatrix();
glFlush(); glutSwapBuffers();}
void affichage () {
glClearColor(1.0,1.0,1.0,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor4f(0.0,1.0,0.0,1.0);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
infographie avec opengl 31
glOrtho(-2.0, 2.0, -2.0, 2.0, 5.0, 15.0);/* projection orthogonale */
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }/* position de la caméra */
Sans l’utilisation d’une liste d’affichage, la programmation du tracé du cercle est inefficace
car tout appel à la fonction dessin() entraîne les calculs des sinus et cosinus. En adoptant la
technique des listes, les calculs sont effectués lors de la création de la liste. Pour tracer le
cercle, il suffit d’insérer l’appel à la fonction : glCallList(1) ;
4.11. LE BROUILLARD
4.11.1. Mise en œuvre
L’application du brouillard suit les étapes suivantes :
• glEnable(GL_FOG); glDisable(GL_FOG); activer ou désactiver le brouillard
• glFogfv(GL_FOG_COLOR, fogcolor); couleur du brouillard spécifiée par la déclaration
GLfloat fogcolor[4] = {0.5,0.5,0.5,1}; (gris )
• glFogi(GL_FOG_MODE, GL_EXP); spécification du type de brouillard : en Opengl, trois
modes sont prédéfinies : (GL_LINEAR, GL_EXP, GL_EXP2). Chaque mode correspond
à une équation de simulation du brouillard
• glFogf(GL_FOG_DENSITY, 0.35); affecte une valeur (0.35) à la densité (ou l’épaisseur)
du brouillard. L’argument varie entre de 0 à 1 (0 : pas de brouillard, 1 : objet
opaque)
• glHint(GL_FOG_HINT, GL_DONT_CARE); contrôle l’importance de la qualité de l’image
par rapport à la vitesse de calcul
• glFogf(GL_FOG_START, 1.0); définit la distance du début du brouillard (par défaut 0.0)
• glFogf(GL_FOG_END, 5.0); définit la distance de la fin du brouillard (par défaut 1.0)
pour ces deux dernières fonctions la distance est relative à la position de la caméra
• glClearColor (0.5, 0.5, 0.5,1); Changement de la couleur du fond. Il est préférable
qu’elle soit identique à la couleur du brouillard. En effet, seuls les objets sont affectés
et non le fond.
Plusieurs équations de simulation sont utilisées :
C = f ×C fragment
+ (1 - f) × C fog
4.11.2. Exemple
/* version améliorée du programme de démonstration du brouillard de Silicon
Graphics, Inc.*/
#include <GL/glut.h>
#include <stdio.h>
#include <math.h>
static GLint fogMode;
void myinit(void) {
GLfloat position[] = { 0.0,3.0,3.0,0.0 };
GLfloat local_view[] = { 0.0 };
glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);
glFrontFace(GL_CW);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE);
glEnable(GL_FOG); fogMode = GL_EXP;
glFogf(GL_FOG_START,1.0); glFogf(GL_FOG_END,25.0);
glFogi(GL_FOG_MODE, fogMode); glFogfv(GL_FOG_COLOR,grisMoyen);
glFogf(GL_FOG_DENSITY,fog_densite); glHint(GL_FOG_HINT,GL_DONT_CARE);}
void display(void) {
glClearColor(0.5,0.5,0.5,0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glScalef(scale, scale,scale); glRotatef(rotx,1.0,0.0,0.0);
glRotatef(roty,0.0,1.0,0.0); glRotatef(rotz,0.0,0.0,1.0);
renderRedTeapot(-4.0,-0.5,-1.0); renderRedTeapot(-2.0,-0.5,-2.0); renderRedTeapot(0.0,-0.5,-3.0);
renderRedTeapot(2.0,-0.5,-4.0); renderRedTeapot(4.0,-0.5,-5.0);
glPopMatrix();
glFlush(); glutSwapBuffers() ;}
void init(void) {
GLfloat light0_position[] = {3.0, 3.0, 3.0, 0.0};
glLightfv(GL_LIGHT0,GL_AMBIENT,noir); glLightfv(GL_LIGHT0,GL_DIFFUSE,blanc);
glLightfv(GL_LIGHT0,GL_SPECULAR,blanc); glLightfv(GL_LIGHT0,GL_POSITION,light0_position);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); }
void affichage () {
glClearColor(1.,1.,1.,1.); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef((GLfloat)rX, 1.0, 0.0, 0.0); /* faire tourner le repère local autour de l'axe x */
glRotatef((GLfloat)rY, 0.0, 1.0, 0.0); /* faire tourner le repère local autour de l'axe y */
if (z_buffer) glEnable(GL_DEPTH_TEST); dessin(); glDisable(GL_DEPTH_TEST);
glPopMatrix();
glFlush(); glutSwapBuffers();}
6. ANNEXES
mode Signification
GLUT_RGBA le mode RGBA (valeur par défaut 1.0, 1.0, 1.0, 1.0)
GLUT_RGB le mode RGB (valeur par défaut 1.0, 1.0, 1.0)
GLUT_INDEX le mode index de couleur (ce mode est prioritaire)
GLUT_ALPHA composante alpha sur le tampon (ou les tampons) de
couleur
GLUT_SINGLE simple tampon (simple buffer) (c’est la valeur par défaut)
GLUT_DOUBLE double tampon double buffer (mode prioritaire que le
simple)
GLUT_ACCUM tampon à accumulation
GLUT_DEPTH tampon de profondeur
GLUT_STENCIL tampon pochoir (stencil)
GLUT_STEREO fenêtre stéréo
GLUT_LUMINANCE fenêtre stéréo avec un modèle de couleur « luminance »
6.3.1. Bibliothèque gl
Liste des fonctions
1. glBegin 26. glGetBooleanv 51. glNormal
2. glBlendFunc 27. glGetDoublev 52. glOrtho
3. glCallList 28. glGetError 53. glPointSize
4. glClear 29. glGetFloatv 54. glPolygonMode
5. glClearColor 30. glGetIntegerv 55. glPolygonStipple
6. glClearDepth 31. glGetLight 56. glPopAttrib
7. glClipPlane 32. glGetMaterial 57. glPopMatrix
8. glColor 33. glInitNames 58. glPopName
9. glCopyPixels 34. glIsList 59. glPushAttrib
infographie avec opengl 38
10. glCullFace 35. glIsEnabled 60. glPushMatrix
11. glDeleteLists 36. glLight 61. glPushName
12. glDisable 37. glLightModel 62. glRasterPos
13. glDrawPixels 38. glLineWidth 63. glReadPixels
14. glEnable 39. glLineStipple 64. glRenderMode
15. glEnd 40. glLoadIdentity 65. glRotate
16. glEndList 41. glLoadMatrix 66. glScale
17. glEvalCoord1 42. glLoadName 67. glSelectBuffer
18. glEvalCoord2 43. glMap1 68. glShadeModel
19. glEvalMesh1 44. glMap2 69. glTexCoord
20. glEvalMesh2 45. glMapGrid1 70. glTexImage1D
21. glFinish 46. glMapGrid2 71. glTexImage2D
22. glFlush 47. glMaterial 72. glTexParameter
23. glFrontFace 48. glMatrixMode 73. glTranslate
24. glFrustum 49. glMultMatrix 74. glVertex
25. glGenLists 50. glNewList 75. glViewport
6.3.2. Bibliothèque glu
Liste des fonctions
1. gluBeginSurface 9. gluNewTess
2. gluEndSurface 10. gluErrorString
3. gluLookAt
4. gluNewNurbsRenderer
5. gluNurbsProperty
6. gluNurbsSurface
7. gluPerspective
8. gluPickMatrix
Objets 3D prédéfinis par glu
• glu permet de créer des objets quadratiques (sphère, cylindre, disque, …).
• Permet de créer des objets complexes à l’aide des NURBS ou mettre en œuvre une
technique de tesselation (triangulation)
La procédure de création de ces objets suit les étapes suivantes
1. GLUquadricObj *pObj; définition du pointeur d'objet à déclarer en global ou dans la
même fonction
2. pObj = gluNewQuadric(); Initialisation et création d'un nouvel objet (Retourne 0 si la
mémoire est insuffisante)
3. gluQuadricDrawStyle(Quadric1, mode); Le premier argument indique la quadratique à
créée. Le second est le mode d’affichage GLU_FILL : mode solide (mode par défaut),
GLU_LINE : mode filaire, GLU_POINT : mode point). L’appel de cette fonction peut se
faire avant chaque objet pour définir son mode d’affichage. Ainsi, les objets d’une
scène peuvent s’afficher en différents modes.
4. gluQuadricNormals(pObj, GLU_SMOOTH); application des normales
5. gluSphere (pObj, 10, 20, 30); appel de la fonction de création la sphère pour ce cas
6. gluDeleteQuadric (pObj); fin de création, destruction de l'objet et libération de la mémoire
infographie avec opengl 39
Fonction Description
gluCylinder(pObj, baseRadius, topRadius, height, Cylindre orienté le long de l’axe et de
slices, stacks);
base au plan z=0 (le cylindre n’est pas
fermé)
gluDisk (pObj, innerRadius, outerRadius, slices, Disque dans le plan z=0 (Slices : nombre
loops);
de secteurs, loops: nombre de cercles
concentriques)
gluPartialDisk(pObj, innerRadius, outerRadius, Portion du disque dans le plan z=0
slices, loops, startAngle, sweepAngle);
gluSphere (pObj, radius, slices, stacks); Sphère centrée à l’origine
• Les rayons, la hauteur et les angles sont de type GLdouble et les autres de type GLint.
• L’objet crée étant situé à l'origine, les transformations (translations, rotations, …)
permettent de le placer à l’emplacement voulu.
• Lors des tests, pour apprécier l’influence des différents paramètres, il est conseillé
d’opter pour l’affichage en mode filaire
6.4. DIVERS
6.4.1. versions et informations
const GLubyte glGetString(GLenum, name); Permet de retourner des informations concernant la version
de la bibliothèque utilisée. L’argument name peut prendre les valeurs :
• GL_VERSION retourne une chaîne de caractères qui permet d’identifier la version
• GL_VENDOR retourne le nom de la compagnie responsable de la version utilisée
• GL_RENDER retourne de la version utilisée
• GL_EXTENSIONS retourne de la version utilisée
• GLU_VERSION retourne une chaîne de caractères (string) qui permet d’identifier la version
• GLU_EXTENSIONS retourne de la version utilisée de glu
6.4.2. prochaine versions du document
Application de la texture, Affichage texte, glPolygonStipple(), ;
infographie avec opengl 41