Pour afficher du texte dans une fenêtre Glut, il faut utiliser les fonctions glutBitmapCharacter
et
glutStrokeCharacter
. Ces deux fonctions affichent un caractère selon la police de caractères
indiqué. D'où la nécessité de créer une fonction qui permette d'afficher une chaîne
de caractères directement. Précisons tout d'abord le fonctionnement de ces deux fonctions :
void glutBitmapCharacter ( void *font, int character );
Le premier argument est la police de caractères choisie.
Le deuxième argument est le caractère à afficher.
Polices de caractères possibles :
Police | Description | Aperçu | ||||||
GLUT_BITMAP_8_BY_13
|
Largeur fixe
Chaque caractère est contenu dans un rectangle de 8 par 13 pixels |
![]() |
||||||
GLUT_BITMAP_9_BY_15
|
Largeur fixe
Chaque caractère est contenu dans un rectangle de 9 par 15 pixels |
![]() |
||||||
GLUT_BITMAP_TIMES_ROMAN_10
|
Police Times Roman de 10 points
Espacement proportionnel |
![]() |
||||||
GLUT_BITMAP_TIMES_ROMAN_24
|
Police Times Roman de 24 points
Espacement proportionnel |
![]() |
||||||
GLUT_BITMAP_HELVETICA_10
|
Police Helvetica de 10 points
Espacement proportionnel |
![]() |
||||||
GLUT_BITMAP_HELVETICA_12
|
Police Helvetica de 12 points
Espacement proportionnel |
![]() |
||||||
GLUT_BITMAP_HELVETICA_18
|
Police Helvetica de 18 points
Espacement proportionnel |
![]() |
void glutStrokeCharacter ( void * font, int character );
Le premier argument est la police de caractères choisie.
Le deuxième argument est le caractère à afficher.
Polices de caractères possibles :
Police | Description | Aperçu | ||||||
GLUT_STROKE_ROMAN
|
Largeur fixe
Espacement proportionnel |
![]() |
||||||
GLUT_STROKE_MONO_ROMAN
|
Largeur fixe
Espacement fixe |
![]() |
Nous allons maintenant expliquer comment afficher directement un chaîne de caractères. Pour cela, il faut créer une fonction qui affiche les caractères de la chaîne passée en paramètre en utilisant les deux fonctions que l'on vient de détailler.
void vBitmapOutput(int x, int y, char *string, void *font)
{
int len,i; // len donne la longueur de la chaîne de caractères
glRasterPos2f(x,y); // Positionne le premier caractère de la chaîne
len = (int) strlen(string); // Calcule la longueur de la chaîne
for (i = 0; i < len; i++) glutBitmapCharacter(font,string[i]); // Affiche chaque caractère de la chaîne
}
void vStrokeOutput(GLfloat x, GLfloat y, char *string, void *font)
{
char *p;
glPushMatrix(); // glPushMatrix et glPopMatrix sont utilisées pour sauvegarder
// et restaurer les systèmes de coordonnées non translatés
glTranslatef(x, y, 0); // Positionne le premier caractère de la chaîne
for (p = string; *p; p++) glutStrokeCharacter(font, *p); // Affiche chaque caractère de la chaîne
glPopMatrix();
}
Pour modifier la couleur du texte, il suffit d'appeler la fonction glColor3d(GLdouble red, GLdouble green, GLdouble blue);
avec la valeur de la couleur souhaitée juste
avant l'appel de la fontion vBitmapOutput
ou vStrokeOutput
. Voici un exemple d'utilisation :
#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
#define WIDTH 640
#define HEIGHT 480
void vDisplay();
void vReshape();
void vBitmapOutput(int x, int y, char *string, void *font);
void vStrokeOutput(GLfloat x, GLfloat y, char *string, void *font);
int main( int argc, char *argv[ ])
{
glutInit(&argc,argv); // initialisation de GLUT
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(WIDTH,HEIGHT);
glutInitWindowPosition(50,50);
glutCreateWindow("Texte");
glutDisplayFunc(vDisplay);
glutReshapeFunc(vReshape);
glutMainLoop();
return 0;
}
void vDisplay()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,1,1); // Texte en blanc
vBitmapOutput(0,0,"Blanc HELVETICA",GLUT_BITMAP_HELVETICA_18);
vBitmapOutput(10,30,"Blanc TIMES_ROMAN",GLUT_BITMAP_9_BY_15);
glColor3d(0.2,0.6,0.2); // Texte en vert
vBitmapOutput(-50,130,"TEXTE ECRIT EN VERT",GLUT_BITMAP_TIMES_ROMAN_24);
glColor3d(0.6,0.6,0.6); // Texte en gris
vStrokeOutput(-300, -200, "Gris",GLUT_STROKE_MONO_ROMAN);
glFlush();
}
void vReshape(int w, int h)
{
float L;
float H;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w<=h)
{
if (w==0) H=HEIGHT;
else H=(GLfloat) (WIDTH*h/w);
L=WIDTH;
}
else
{
H=HEIGHT;
if (h==0) L=WIDTH;
else L=(GLfloat) (HEIGHT*w/h);
}
gluOrtho2D(-L/2,L/2,-H/2,H/2);
}
Le résultat est :