OPENGL - Afficher du texte

 

Introduction

Suivant le système où vous lancez votre programme, le principe pour afficher un texte changera peu. Par contre le chargement d'une fonte dépendra fortement du système.

 

GLUT

Il exise une solution polyvalente: GLUT pour afficher du texte, quelque soit le système d'exploitation, la méthode sera toujours la même. Cependant, il y aura des contraintes: limitation du nombre de fontes utilisables.

 

Linux/Micosoft

Pour l'affichage de textes dans ces deux environnements, voici les explications.

 

Image non trouvée !En principe, des connaissances en développement C sous X Window ou Windows Microsoft seraient nécesaires.

 

Charger une fonte du système

Le principe pour afficher du texte sous OpenGL est d'utiliser les fontes du systèmes.

Ce qui signifie qu'il faudra être capable de les mettre en mémoires:

- Pour Unix, les explications sur la manière de charger une fonte.

- Pour Micosoft, c'est ici.

 

Mémorisation des caractères de la fonte

Maintenant que nous avons les fontes, nous allons générer tous les caractères que nous voulons utiliser sous forme d'image.

- Nous allons utiliser une display list (ou liste d'affichage).

L'alimentation de la display list sous Linux se fait via lafonction glXUseXFont()

void glXUseXFont( Font font,
int first,
int count,
int listBase )

Avec font, l'identifiant de la fonte chargée précédemment

first, n° du premier caractère à mémoriser dans la display list

count, le nombre de caractères à mémoriser

listBase, l'identifiant de la display list


Les erreurs possibles sont:

BadFont si l'identifiant de la fonte n'est pas valide.

GLXBadContextState ou GLXBadCurrentWindow.

 

Sous Microsoft, il faudra d'abord créer la display list

fonteOpenGL = glGenLists(count); avec count, le nombre de caractères que vous voulez générer

Puis produire la liste wglUseFontBitmaps();

BOOL WINAPI wglUseFontBitmaps(
HDC hdc,
DWORD first,
DWORD count,
DWORD listBase
);

Les paramètres étant:

hdc pour indiquer le device contexte.

first indique le premier caractère qui sera utilisé pour créer les bitmaps display lists.
count Indique le nombre de caractères qu'il faut convertir en bitmap display lists

listBase Pointeur sur les displays lists créés précédement.

 

En sortie, la fonction retourne TRUE si tout est ok, sinon FALSE et GetLastError précise l'erreur.

La seule différence ici étant l'utilisation du hdc (handle sur device contexte).

Image non trouvée !Le handle de la fonte ne servira maintenant plus, vous pouvez libérer les ressources. Utilisez XFreeFont() pour Linux, pour microsoft en faisant DeleteObject(font); où font est l'identifiant de la fonte !

 

Afficher du texte

L'affichage se fait en deux temps:

D'abord positionner le texte: Il suffira d'utiliser glRasterPos2f(x, y)

La fonction est une fonction polyforme dans le sens où il existe autant de fonctions qu'il y a de possibilité à passer des coordonnées.

Par exemple 2d, 3d ou 4d en entier, flottant, ...

La syntaxe est donc glRasterPosDTV()

ou D sera remplacée par 2, 3 ou 4

T par s, i, f ou d

V par v pour indiquer que l'on passe les coordonnées non pas directement en indiquant x, y, z ou w (suivant la dimension bien sûr) dans la fonction, mais en passant un pointeur qui pointera sur un tableau contenant x, y, z ou w.

Ex.:

void glRasterPos2f (GLfloat x, GLfloat y); Coordonnées 2D de type flottant

void glRasterPos3fv (const GLfloat *v); Coordonnées 3D de type flottant via un tableau.

 

Puis afficher les caractères mémorisés dans la display list

glListBase(fonteOpenGL); // On demande l'utilisation de la display list de notre fonte
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Affichage du texte

 

Exemple

Voici un exemple de code permettant d'afficher du texte OpenGL sous Linux, Windows Microsoft ou GLUT.

Il y a différentes méthodes: charger une fonte, positionner du texte, afficher du texte, et libérer les ressources.

Pour l'affichage du texte, je passe ici par une liste variable d'arguments.

La méthode bool GLTextOut::GLTextPrint (const char *fmt,...) utilisera les macros va_xxxxxx (Variable Argument)

#include <stdarg.h>
void va_start(va_list ap, param);
type va_arg(va_list ap, type);
void va_end(va_list ap);

Les macros va_start, va_arg et va_end permettent d'accéder aux paramètres des fontions/méthodes acceptant un nombre variable d'arguments.

va_start pointe ap sur le premier argument variable passé. param étant le nom du dernier paramètre nommé, ici, ce sera fmt.

la macro va_arg renvoie le premier argument variable et fait pointer ap sur l'argument suivant. type est le type de l'argument qui va être lu et va_arg génère une expression de ce même type.

la macro va_end remet tout en état normal avant le retour à la fonction appelante.

Image non trouvée !

Pour le reste, rien de bien compliqué.