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.
La fonction glClear():
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 aurions pu définir un simple buffer au niveau du pixel format (chapitre précédent). Dans ce cas, nous n'aurions rien d'autres à faire.
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.
C'est pourquoi j'ai positionné l'option double buffer au niveau du pixel format. 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 SwapBuffers(HDC)
Voyons voir si tout ce que je viens de dire fonctionne: