Vous êtes sur la page 1sur 5

15/12/2013

Buffer des couleurs

Synthèse d’images et programmation 3D Les buffers en OpenGL sont des espaces mémoire contenant
des données propres à OpenGL. Le Buffer principal est celui
sous OpenGL (Note du cours 3). des couleurs.
Lors du rafraichissement de l’écran, on doit vider le Buffer
des couleurs :

M. AIT KBIR glClear(GL_COLOR_BUFFER_BIT);


La Couleur est un état de la machine OpenGL, toutes les
Départ. Génie Informatique FST de Tanger
primitives affichées par la suite prennent la couleur fixée. La
couleur est aussi composée en fonction des calculs
d’éclairage et de transparence.

1 M. AIT KBIR 2

Mode RGBA et Couleurs Indéxées Double Buffering


RGBA: Pour ne pas voir se déssiner la scène on utilse deux buffer
pour les couleurs : le front-buffer et le back-buffer. Ce qui
• glutInitDisplayMode (GLUT_RGB);
permet un affichage complet et non discontnue des primitives
• glColor3f(r, v, b); des objets de la scène.
• glClearColor (r, v, b, a);
glutInitDisplayMode (GLUT_SINGLE ): avec ce mode pour
Couleurs indéxées: afficher le buffer, ce qui est dessiné, on utilise glFlush ();
• glutInitDisplayMode (GLUT_INDEX);

• glIndexi(index); glutInitDisplayMode (GLUT_DOUBLE ): avec ce mode on


déssine dans le back-buffer mais rien ne s’affiche à l’écran.
• glutSetColor(indexcolor, r, g, b);
l’affichage se fait appelant la fonction glutSwapBuffers()
• glClearIndex(index);


M. AIT KBIR 3 M. AIT KBIR 4

1
15/12/2013

Paramètres d’affichage des polygones Comment traiter la profondeur


Un polygone dispose de deux faces qui sont remplies par défaut. Comment déterminer ce qui est affiché et ce qui ne l’est pas ?
L’orientation du polygone est définie par l’ordre de présentation des
Tout tracer depuis l’arrière vers l’avant (Algorithme du peintre).
sommets. Pour modifier les paramètres des polygones on fait appelle
à: glPolygonMode(GL_FONT/GL_BACK/GL_FRONT_AND_BACK,
GL_POINT/ GL_LINE/ GL_FILL)

La face frontale (ou avec orientation positive) est celle où les


sommets sont présentés dans le sens contraire des aiguilles
d’un montre.
M. AIT KBIR 5 M. AIT KBIR 6

Back-face Culling (Elimination des faces cachées ) Back-face Culling (Elimination des faces cachées )
§ Si une surface pointe dans la même direction que la
caméra, donc il s’agit d’une face cachée ( back face).
L’orientation du plan d’un polygone peut être
§ Le test se base sur le calcul du produit scalaire: si N *
modifiée par la fonction: glFrontFace(GL_CCW/GL_CW);
V > 0 alors la face est à ignorer. Pour activer l’élimination des faces cachées:

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT/GL_BACK/GL_FRONT_AND_BACK);

Pour désactiver l’élimination des faces cachées:


glDisable(GL_CULL_FACE);

M. AIT KBIR M. AIT KBIR

2
15/12/2013

Problèmes Z-buffer (Depth-buffer)

Z-buffer est une matrice 2D qui stocker la valeur de la


profondeur pour chaque pixel.
Catmull a mis au point en 1979 un algorithme qui permet de
dessiner des objets sur l’écran sans tri et sans calcul des
intersections entre les objets.
§Intialisation de l’écran:
pour chaque pixel
Ecran[i][j] := COULEUR_FOND ; Zbuffer[i][j] := ¥;
Intersection des Recouverement
objets §Déssiner un point (x, y, z, coleur) -> (i, j)
des objets
si (z <= Zbuffer[i][j]) alors
Ecran[i][j] := couleur; Zbuffer[i][j] := z;

M. AIT KBIR M. AIT KBIR

Z-buffer (Depth-buffer) Transparence et alpha-blending

Si un point plus proche à la caméra arrive, on Il s’agit de préciser comment la couleur des pixels de la surface à
remplace la couleur du point et la valeur de la tracer doit être mélangée avec celle des pixels déjà en place. Quand on
profondeur dans le buffer de profondeur. Le Z-buffer ajoute une couche colorée transparente (RGB2, A2) devant une couche
(RGB1, A1), l'image déjà présente à l'écran, la couleur résultante est
est effacé avec la commande: RGB2*A2+RGB1*(1-A2) et si on l'ajoute derrière RGB2*(1-A1)+RGB1*A1
glClear(GL_DEPTH_BUFFER_BIT);
Pour activer le canal alpha, il faut faire appel à la fonction glEnable :
Pour activer le Z-buffer:
glEnable(GL_BLEND) ;
glEnable(GL_DEPTH_TEST);
Le paramétrage général est effectué par la fonction :
Comparaison à faire:
void glBlendFunc( GLenum S, GLenum D)
glDepthFunc(val);
val peut prendre : GL_LESS(valeur par défaut), GL_GREATER,
GL_LEQUAL, GL_GEQUAL, GL_NOTEEQUAL, GL_EQUAL)
M. AIT KBIR M. AIT KBIR

3
15/12/2013

Transparence et alpha-blending Fonction callback : pas d’événement


La couleur affichée : RGB = RGB2*S + RGB1*D
ZERO
S
(0,0,0,0)
valeur
Un programme sous OpenGL/GLUT peut exécuter
ONE
DST_COLOR
(1,1,1,1)
(R1 ,G1 ,B1 ,A1 )
continuellement en arrière plan une fonction réalisant
ONE_MINUS_DST_COLOR (1,1,1,1) - (R1 ,G1 ,B1,A1)
ßValeurs possibles de S et D. une tâche particulière ou une animation quand les
événements enregistrés ne sont pas reçus. Cette
SRC_ALPHA (A2 , A2 , A2 , A2 )
ONE_MINUS_SRC_ALPHA (1,1,1,1) - (A2 ,A2 ,A2 ,A2)
DST_ALPHA
ONE_MINUS_DST_ALPHA
(A1 ,A1 ,A1 ,A1 )
(1,1,1,1) - (A1 ,A1 ,A1 ,A1)
Valeurs les plus utilisées: routine de rappel de fonction n'a aucun paramètre.
SRC_ALPHA_SATURATE
D
(f,f,f,1) avec f = min (A2 , 1 - A1 )
Valeur
S=GL_SRC_ALPHA
Exemple ( monIdle est la fonction à appeler ):
ZERO (0,0,0,0)
ONE (1,1,1,1)
glutIdleFunc(monIdle);
SRC_COLOR (R2 ,G2 ,B2 ,A2 ) D=GL_ONE_MINUS_SRC_ALPHA
ONE_MINUS_SRC_COLOR (1,1,1,1) - (R2 ,G2 ,B2,A2) void monIdle() {
SRC_ALPHA (A2 , A2 , A2 , A2 )
ONE_MINUS_SRC_ALPHA (1,1,1,1) - (A2 ,A2 ,A2 ,A2) …………
DST_ALPHA (A1 , A1 , A1 , A1 )
ONE_MINUS_DST_ALPHA (1,1,1,1) - (A1 ,A1 ,A1 ,A1) glutPostRedisplay(); // Rafraichissement de l’écran
SRC_ALPHA_SATURATE (f,f,f,1) avec f = min (A2 , 1 - A1 )

M. AIT KBIR
} M. AIT KBIR 14

Interaction avec le clavier Interaction avec le clavier

Function callback pour enregistrer l’action sur une touche ordinaire : Fonction callback pour enregistrer l’action sur une touche spéciale:

glutKeyboardFunc(void *f (unsigned char key, int x, int y)) glutSpecialFunc(void *f (int key, int x, int y));

Exemple : (consulter glut.h pour voir les symboles qui


Exemple : correspondent aux touches directionnelles et aux touches
fonctions)
glutKeyboardFunc(uneTouche); glutSpecialFunc(uneTouche);
Void uneTouche(unsigned char key, int x, int y){ void uneTouche(int key, int x, int y){
if(key==‘q’) if(key== GLUT_KEY_F1)

exit(0);
} if(key== GLUT_KEY_UP)
}
M. AIT KBIR 15 M. AIT KBIR 16

4
15/12/2013

Interaction avec le clavier Interaction avec la souris (clic)


Fonction pour lire l’état des touches spéciales : int glutGetModifiers()
Enregistrer les événements souris :
n CTRL (GLUT_ACTIVE_CTRL)
nSHIFT (GLUT_ACTIVE_SHIFT) void glutMouseFunc(void (*f) (int button, int etat, int x, int y);
n ALT (GLUT_ACTIVE_ALT ) Button peut prendre :
n GLUT_LEFT_BUTTON
Exemple: n GLUT_RIGHT_BUTTON
n GLUT_MIDDLE_BUTTON
if((glutGetModifiers() & GLUT_ACTIVE_CTRL) && (key == ‘c’))
exit(0); etat peut prendre :
n GLUT_UP
n GLUT_DOWN

M. AIT KBIR 17 M. AIT KBIR 18

Interaction avec la souris (mouvement) Voir la liste complète : glut.h


/* GLUT callback sub-api */
Mouvement avec bouton pressé: void glutDisplayFunc(void (*)(void));
void glutReshapeFunc(void (*)(int width, int height));
void glutKeyboardFunc(void (*)(unsigned char key, int x, int y));

void glutMotionFunc(void (*f) (int x, int y)); void glutMouseFunc(void (*)(int button, int state, int x, int y));
void glutMotionFunc(void (*)(int x, int y));
void glutPassiveMotionFunc(void (*)(int x, int y));
void glutEntryFunc(void (*)(int state));

Mouvement avec bouton non pressé: void glutVisibilityFunc(void (*)(int state));


void glutIdleFunc(void (*)(void));
void glutTimerFunc(unsigned int millis, void (*)(int value), int value);
void glutMenuStateFunc(void (*)(int state));

void glutPassiveMotionFunc(void (*f) (int x, int y); #if (GLUT_API_VERSION >= 2)


void glutSpecialFunc(void (*)(int key, int x, int y));
void glutSpaceballMotionFunc(void (*)(int x, int y, int z));
void glutSpaceballRotateFunc(void (*)(int x, int y, int z));
void glutSpaceballButtonFunc(void (*)(int button, int state));

Détecte l’entrée et la sortie de la souris de la fenêtre extern void glutButtonBoxFunc(void (*)(int button, int state));
void glutDialsFunc(void (*)(int dial, int value));
void glutTabletMotionFunc(void (*)(int x, int y));
graphique: void glutTabletButtonFunc(void (*)(int button, int state, int x, int y));

#if (GLUT_API_VERSION >= 3)

void glutEntryFunc(void (*f) (int etat)) ; void glutMenuStatusFunc(void (*)(int status, int x, int y));
void glutOverlayDisplayFunc(void (*)(void));
#endif

etat peut prendre :


#endif
GLUT_ENTERED ou GLUT_LEFT

M. AIT KBIR 19 M. AIT KBIR 20