Initialiser les surfaces logique et physique
Evidemment, avec de la 3D, on peut faire de la 2D. Il suffit pour cela d'oublier la profondeur (axe z).
En fait, ceci va surtout nous permettre de voir les fonctions de base, sachant qu'elles seront réutilisées pour la 3D.
Initialiser notre frame de surface avec une couleur:
Avant de dessiner quoi que ce soit, nous allons initialiser (ou d'effacer si vous préférez) le fond de notre écran. On pourra tout d'abord choisir la couleur à utiliser:
Pour cela, nous utiliserons la fonction glClearColor():
void glClearColor( GLclampf rouge,GLclampf vert,GLclampf bleu,GLclampf alpha )
Chacune des valeurs variant de [0,1], il s'agit d'un nombre flottant.
Par défaut, les valeurs sont toutes positionnées à 0.
Exemple pour mettre en blanc:
glClearColor(1.0f,1.0f,1.0f,0.0f);
rouge:
glClearColor(0.5f,0.0f,0.0f,0.0f);
Rouge vif:
glClearColor(1.0f,0.0f,0.0f,0.0f);
Cette fonction
ne peut pas être utilisée entre deux fonctions que nous verrons
bientôt : glBegin et glEnd. Dans ce cas, la fonction génèrerai
le code GL_INVALID_OPERATION.
Il ne nous reste plus qu'à appliquer cette couleur.
void glClear( GLbitfield nombuffer )
Cette fonction efface les buffers indiqués avec la valeur prédéfinie par la fonction correspondant à ce buffer.
Pour le moment, le buffer qui nous intéresse se nomme GL_COLOR_BUFFER_BIT (à mette à la place de nombuffer) et la couleur est initialisée via la fonction glClearColor()
Mais il existe d'autres buffers, que nous verrons plus tard...
Cette fonction
ne peut pas être utilisée entre deux fonctions que nous verrons
bientôt : glBegin et glEnd. Dans ce cas, la fonction génèrerai
le code GL_INVALID_OPERATION.
Elle générera aussi GL_INVALID_VALUE s'il la valeur de nombuffer est invalide
Il s'agit enfin de voir le rendu à l'écran:
void glFlush( void )
Cette fonction force toutes les opérations graphiques en cours à ce terminer le plus rapidement possible.
On pourra utiliser en association la commande glFinish (void glFinish( void )) pour attendre la fin de toutes les commandes gl.
Ces deux fonctions
généreront là aussi le code GL_INVALID_OPERATION si utilisées
entre glBegin et glEnd.
Nous pouvons définir un simple buffer au niveau de l'écran. Dans ce cas, nous n'aurions rien d'autres à faire car l'écran logique et l'écran physique ne font qu'un..
Mais il serait dommage de se limiter à 1 écran logique et physique sur la même zone mémoire. Car cela signifiera certainement un effet de scintillement.
Pour modifier cela, nous allons demander à Glut de gérer ces deux écrans dans notre fenêtre:
Nous avons déjà vu la commande void glutInitDisplayMode(unsigned int mode);
nous avons indiqué le mode de rendu du pixel (GLUT_RGBA). Nous allons y ajouter la gestion des buffers écrans:
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
Dans ce cas, glFlush() provoque le rendu de l'image dans l'écran logique. Il faudra donc swapper l'écran logique et physique pour voir le résultat (L'écran logique devient physique et inversement).
Pour cela, nous utiliseront void glutSwapBuffers(void)
glutSwapBuffers();
Reste à voir où mettre tout ce code:
void glClearColor( GLclampf rouge,GLclampf vert,GLclampf bleu,GLclampf alpha ) permet de définir la couleur de remplissage du fond. Nous pourrons donc le positionner juste avant de rentrer dans la gestion la fenêtre (glutMainLoop()()).
void glutInitDisplayMode(unsigned int mode) est aussi à positionner pour l'initialisation de la fenêtre, donc juste avant sa création !
Par contre, glClear(), glFlush() et glutSwapBuffers() sont des fonctions d'affichage.
Il faut donc avoir un point d'entrée dans GLUT pour gérer l'affichage de notre fenêtre. Ce qui se fait par la fonction glutDisplayFunc()
void glutDisplayFunc(void (*func)(void)); à mettre avant d'entrée dans la boucle de gestion de notre fenêtre !
En entrée, nous indiquons simplement le nom de notre procédure qui va gérer l'affichage donc le glClear(), glFlush() et glutSwapBuffers() !
Voyons voir si tout ce que je viens de dire fonctionne: