Création d'une fenêtre

Nous allons voir comment réaliser une fenêtre avec GLUT. Cette fenêtre ne sera constituée que d'un fond unicolore. Pour cela, nous allons utiliser les fonctions de Windows, d'OpenGL et de GLUT. Il faut donc inclure les fichiers d'en-tête correspondants :


#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>

Ensuite, il faut déclarer les fonctions que nous allons utiliser et que nous définirons par la suite. Dans notre cas, il n'y a que la fonction d'affichage qui sera appelée par la fonction glutDisplayFunc :

void vDisplay();

Nous pouvons maintenant créer notre fonction principale, la fonction main. Les étapes de ce main, que nous détaillerons ensuite, sont :

int main( int argc, char *argv[ ])
{
	glutInit(&argc,argv);	// initialisation de GLUT : argc et argv sont respectivement
				// le nombre et la liste des paramètres passées en ligne de commande
	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);	// GLUT_RGBA mode "vraies couleurs" 32 bits
							// GLUT_SINGLE "simple buffering" - un seul tampon
							// Modes par défaut
	glutInitWindowSize(640,480);	// Initialisation de la largeur et de la hauteur de la fenêtre
	glutInitWindowPosition(50,50);	// Position de la fenêtre sur l'écran par rapport au coin haut gauche
	glutCreateWindow("Fenêtre créée avec Glut");	// Titre de la fenêtre
	glutDisplayFunc(vDisplay); // précise la fonction à utiliser pour l'affichage
	glutMainLoop(); // lance le gestionnaire glut
	return 0;
}





La fonction glutInit initialise la bibliothèque GLUT et traite les paramètres passés en ligne de commande (ces parmaètres ont été récupérés par la fonction main) :

void glutInit ( int *argcp, char **argv);

Les paramètres de la ligne de commande compris par GLUT sont détaillés
ici.



La fonction glutInitDisplayMode spécifie le mode d'affichage de la fenêtre :

void glutInitDisplayMode ( unsigned int mode );

L'argument mode peut prendre les valeurs suivantes (les valeurs par défaut sont en bleu) :

GLUT_RGBA mode "vraies couleurs" 32 bits
GLUT_RGB alias de GLUT_RGBA
GLUT_INDEX mode couleurs indéxées, l'emporte sur GLUT_RGBA s'il est spécifié
GLUT_SINGLE tampon simple pour la fenêtre
GLUT_DOUBLE fenêtre avec un double tampon, l'emporte sur GLUT_SINGLE
GLUT_ACCUM fenêtre avec un tampon d'accumulation
GLUT_ALPHA fenêtre avec une composante alpha sur les tampons de couleur
GLUT_DEPTH fenêtre avec un tampon de profondeur
GLUT_STENCIL fenêtre avec un tampon de pochoir
GLUT_MULTISAMPLE fenêtre avec échantillonage multiple
GLUT_STEREO fenêtre stéréo
GLUT_LUMINANCE fenêtre avec un modèle de couleur "luminance"


Dans notre exemple, nous avons utilisé les modes par défaut. L'appel à cette fonction n'est donc pas utile dans ce cas. Nous aurons besoin d'utiliser d'autres paramètres dans la suite pour la gestion de l'animation notamment.

Un tampon (ou buffer) désigne une zone de la mémoire contenant des données. Ici, nous n'utilisons que le tampon d'affichage (frame buffer).



La fonction glutInitWindowSize spécifie la taille de la fenêtre :

void glutInitWindowSize ( int width, int height);

les paramètres width et height indiquent respectivement la largeur et la hauteur de la fenêtre en pixels.



La fonction glutInitWindowPosition spécifie la position de la fenêtre sur l'écran :

void glutInitWindowPosition ( int x, int y);

les paramètres x et y indiquent la position en x et en y du coin haut gauche de la fenêtre, par rapport au coin haut gauche de l'écran, en pixels.



La fonction glutCreateWindow crée une fenêtre :

int glutCreateWindow ( char * name );

le paramètre name est une chaîne de caractères ASCII qui est le nom de la fenêtre (dans sa barre de titre).

Cette fonction retourne un entier positif identifiant le numéro de la fenêtre. Cet entier peut par la suite être utilisé pour identifier la fenêtre. La fenêtre qui vient d'être créée devient la fenêtre courante.

La fenêtre est maintenant créée, Il faut ajouter les fonctions gérant les événements comme le déplacement de la fenêtre, la frappe d'une touche ou le clic de souris... Pour cela, il faut appeler les fonctions GLUT appropriées. Nous souhaitons pour l'instant juste afficher une fenêtre, nous allons donc appeler la fonction glutDisplayFunc.



La fonction glutDisplayFunc établit la fonction de rappel pour l'affichage :

void glutDisplayFunc ( void (*func)(void));

func identifie la fonction de rappel d'affichage qui est une fonction sans paramètres. Dans notre exemple, cette fonction est
vDisplay.



La fonction glutMainLoop permet d'entrer dans la boucle de GLUT de traitement des événements :

void glutMainLoop ( void );

Cette fonction doit être appelée et une seule fois dans une application. Dans cette boucle, les fonctions de rappel qui ont été enregistrées sont appelées à tour de rôle. Cette fonction ne rend jamais la main.



Nous allons maintenant détailler la fonction de rappel pour l'affichage, vDisplay :



void vDisplay()
{
	glClearColor(0,0,0,0); // sélectionne la couleur noire (qui est celle par défaut)
	glClear(GL_COLOR_BUFFER_BIT); // efface le frame buffer
	glFlush();
}




La fonction glClearColor spécifie les valeurs d'effacement pour les tampons de couleur :

void glClearColor(
  GLclampf red,    
  GLclampf green,  
  GLclampf blue,   
  GLclampf alpha   
);


Les paramètres red, green, blue et alpha sont compris entre 0 et 1. Les valeurs par défaut sont toutes zéro.

La fonction glClear remplit un tampon avec la couleur choisie par glClearColor. (Si l'on souhaite afficher une fenêtre de couleur noire, il n'est pas obligatoire d'appeler glClearColor(0,0,0,0); puisque par défaut, glClear remplit le tampon avec la couleur noire) :

void glClear(
  GLbitfield mask   
);


Le parmètre mask indique le tampon à effacer. Il peut être GL_COLOR_BUFFER_BIT, (tampon activé pour l'écriture en couleurs) GL_DEPTH_BUFFER_BIT (tampon de profondeur), GL_ACCUM_BUFFER_BIT (tampon d'accumulation) ou GL_STENCIL_BUFFER_BIT (tampon de pochoir).

Enfin, la fonction glFlush termine le dessin de la scène, en forçant toutes les commandes à être éxécutées. Elle envoie les données vers le tampon d'affichage.

void glFlush(void);