Création d'une fenêtre
Position et taille de la fenêtre
Avant d'afficher une fenêtre à l'écran, il peut être intéressant de déterminer sa position à l'écran ainsi que sa taille.
Il y a deux fonctions pour cela:
Pour positionner la fenêtre: void glutInitWindowPosition(int x,GLint y);
Avec x et y les coordonnées de la fenêtre en pixel
Pour définir la largeur et la hauteur: void glutInitWindowSize(int largeur,int hauteur);
Avec largeur et hauteur qui sont la largeur et la hauteur de la fenêtre.
On indique la
taille de la fenêtre. Du fait des bordures et barre de titre, ... , la
taille de la zone cliente (càd la zone où vous allez effectivement
dessiner) sera plus petites en taille ! Voici une première limite de
GLUT, vous ne pouvez pas indiquer la taille de la zone cliente...
Attention, sous
Unix, le serveur X Window n'est pas obligé d'obéir à votre
requète de positionnement ou de dimensionnement. Il peut donc être
judicieux après création de la fenêtre d'utiliser glutReshapeWindow
pour être au moins certain de la dimension de votre fenêtre.
Ces deux opérations
ne seront effectivement effectuées que lorsque GLUT entrera dans la gestion
de ses fenêtres via glutMainLoop() (vu plus loin).
Mode affichage
Enfin, nous allons indiquer le mode d'affichage d'un pixel: void glutInitDisplayMode(unsigned int mode);
Avec mode pouvant prendre une des valeurs suivantes (Utilisez | pour 'cumuler' les options du mode)
Valeur | Désignation |
GLUT_RGBA | Valeur par défaut Rouge, vert, bleu et alpha |
GLUT_RGB | Alias GLUT_RGBA |
GLUT_INDEX | Mode index de couleur (si GLUT_RGBA est aussi indiqué, c'est GLUT_INDEX qui l'emporte) |
GLUT_SINGLE | Simple tampon, cette option permet d'afficher directement votre rendu dans la fenêtre, mais ne permet donc pas l'animation (pas de surface physique/logique car confondu). Valeur par défaut. Donc si ça scintille, utiliser l'option suivante GLUT_DOUBLE. |
GLUT_DOUBLE | Double tampon, cette option est appropriée pour l'animation ! (Voir surface logique et physique). Si GLUT_SINGLE est aussi spécifié, GLUT_DOUBLE l'emporte |
GLUT_ACCUM | Masque de bits pour choisir une fenêtre avec un tampon d'accumulation. |
GLUT_DEPTH | Masque de bits pour choisir une fenêtre avec un tampon de profondeur (Voir z-buffer sous OpenGL). |
GLUT_STENCIL | Masque de bits pour choisir une fenêtre avec un tampon de pochoir. |
GLUT_STEREO | Masque de bits pour choisir une fenêtre stéréo. |
GLUT_MULTISAMPLE | Pour l'antialiasing |
Généralement, vous positionnerez mode au minimum à GLUT_RGBA | GLUT_DOUBLE (Pour Rouge, Vert, Bleu et Alpha et double buffer), voir vous ajouterez | GLUT_DEPTH pour gérer le z-buffer.
Il ne nous resta alors plus qu'à créer la fenêtre: int glutCreateWindow(char *name); avec name pour donner le nom de notre fenêtre.
Pour terminer, il faut rentrer dans une boucle de gestion de la fenêtre qui affichera entre autre la fenêtre à l'écran.
Enfin, création de la fenêtre
Et bien oui, il faut maintenant ordonner la création de la fenêtre !
Nous utiliserons la fonction glutCreateWindow() qui est très très simple d'utilisation:
int glutCreateWindow ( char * name );
Avec en entrée:
Name qui contient le titre de notre fenêtre.
En sortie
Handle GLUT de notre fenêtre (donc inexploitatble en dehors de GLUT).
Cette opération
ne sera effectuée que lorsque GLUT entrera dans la gestion de ses fenêtres
via glutMainLoop() (vu plus loin).
Voir exemple GLUT de base:
Si vous lancez
votre code maintenant, vous obtiendrez une erreur fatale:
Dans ce code, j'utilise la fonction glutMainLoop(), que nous n'avons pas encore vu...
Cette fonction va permettre de gérer la fenêtre GLUT. Or, il est obligatoire depuis la version 3 de GLUT de préciser une procédure de gestion de l'affichage du contenu de la zone cliente. Ce que nous n'avons pas encore car pas encore vu !