Je vais à présent vous proposer une alternative intéressante dans la mesure où celle-ci est beaucoup plus simple à mettre en oeuvre que la technique vue précédemment.
En effet, jusqu'à maintenant, nous avons dû charger les fonctions d'une extension une par une, cette étape peut s'avérer être une vraie perte de temps.
Heureusement pour nous, de gentils programmeurs ont décidés de nous faire une jolie bibliothèque qui s'occuperait de ce boulot à notre place :
GLEW.
GLEW permet de faire quoi concrètement ?
Elle vient en réalité
remplacer les opérations de chargement que nous faisons auparavant avec la SDL, elle se charge de les faire à notre place, GLEW est surtout là pour vous faire gagner du temps ! Avec GLEW, plus besoin de charger les fonctions des extensions une par une, elle les charge pour vous automatiquement.
Et comment elle fait pour savoir si on a envie d'une extension ou pas ?
Elle ne le sait pas, elle charge toutes les extensions que votre matériel supporte. Rassurez-vous, cela ne consomme pas plus de mémoire, ce n'est pas un handicap, loin de là
Attention cependant, vous ne pouvez pas décider de charger les extensions avec GLEW
et avec la SDL, c'est soit l'un soit l'autre : ce sont
deux techniques différentes.
D'ailleurs, l'utilisation de GLEW ne nécessite
pas de posséder l'en-tête glext.h
Bon, avant de pouvoir utiliser cette bibliothèque, il faut l'installer.
Installation de la bibliothèque GLEW
Sous Linux
Vous avez le choix :
- Si vous utilisez Apt (pour les Debian-like comme Ubuntu), deux simples commandes sont à lancer :
Code : Console | sudo apt-get install libglew-dev |
Code : Console | sudo apt-get install libglew1 |
- Si vous préférez compiler GLEW vous-même, dans ce cas rendez-vous sur le site web de GLEW et téléchargez les sources.
- Si vous avez un RedHat-like, dans ce cas je vous propose soit de compiler les sources vous-mêmes, soit de maîtriser votre gestionnaire de paquets mieux que moi
Si vraiment vous n'y connaissez rien, tentez ces commandes (en root) :
Code : Console
Code : Console
ou bien allez lire ce tutoriel sur l'installation de logiciels sous Linux rédigé par bluestorm.
Sous Windows
Téléchargez
le code source de GLEW. (vous verrez pourquoi plus tard)
Décompressez l'archive et prenez tous les en-têtes présents dans le dossier
include/GL/ (glew.h et wglew.h normalement) et placez-les dans le répertoire
include/GL/ de votre compilateur. (
C:\Program Files\CodeBlocks\include\GL\ pour Code::Blocks)
Création d'un projet utilisant GLEW
Les headers
Il est important (et logique) d'inclure avant tout l'en-tête de la bibliothèque GLEW dans nos codes source qui l'utiliseront.
Les habituelles inclusions pour OpenGL :
Code : C1
2 | #include <GL/gl.h>
#include <GL/glu.h>
|
seront donc remplacées par la simple inclusion du fichier glew.h :
Code : C
Vous inquiétez pas, ce petit remplacement de fichiers ne nuira pas du tout, glew.h s'occupe de tout
Attention : si vous incluez un en-tête d'OpenGL avant glew.h, une erreur de compilation (de pré-compilation plus précisément) se déclenchera. Vous pouvez en revanche inclure gl.h et glu.h après glew.h, cela ne pose pas de problème, mais c'est inutile dans la mesure où glew.h bloque l'inclusion de ces fichiers (il défini __gl_h_ entre autres).
Passons à présent à la configuration des projets.
Sous Linux
Rien de plus simple, il vous suffira de rajouter cette commande avec GCC : -lGLEW
Elle permet, comme vous vous en doutez, de lier la bibliothèque GLEW.
Voilà, rien de plus
Sous Windows
La création ainsi que la configuration d'un projet utilisant GLEW sont les mêmes sous Code::Blocks ainsi que sous Dev-C++.
Pour commencer, créez un simple projet SDL (
SDL Application sous Code::Blocks,
Window Application sous Dev-C++). Ajoutez vos codes source au projet
ainsi que le fichier glew.c, présent dans le dossier src/ de l'archive contenant le code source de GLEW.
Quoi ? On va compiler le code source de cette bibliothèque ?
Oui effectivement. C'est en fait la seule solution que j'ai trouvée pour pouvoir utiliser GLEW sous Windows. Mais ne vous inquiétez pas, ce n'est pas une très grosse bibliothèque et par conséquent elle ne mettra pas beaucoup de temps à se compiler
Ensuite, passons à la configuration du projet. C'est l'étape la plus rigolote.
Comme nous avons inclus le code source de la bibliothèque GLEW directement dans notre projet, il va falloir préciser à GLEW qu'on ne l'utilisera pas sous forme de DLL. Pour cela, il nous faudra définir une macro dans tous les fichiers qui utiliseront glew.h, en gros : dans tous les fichiers du projet.
Simple, on rajoute un #define dans glew.h et c'est terminé !
Non, nous allons faire autrement, car glew.h ne fait
PAS parti de notre projet, si vous l'avez inclus au projet, enlevez-le.
Pour définir une macro dans tous les fichiers du projet, nous allons utiliser une commande très simple du compilateur.
Si vous pensez à -D, alors vous avez gagné
Sous Code::Blocks, il faut aller dans le menu
Project ->
Build options -> onglet
Compiler -> onglet
#defines, puis entrer le nom de la macro que l'on souhaite définir dans le champ libre.
Et quelle est le nom de la macro qu'on veut définir d'ailleurs ?
GLEW_STATIC.
Lorsqu'elle est définie, GLEW considère qu'il est utilisé directement au sein d'un projet (notre cas) et adapte donc son code source en fonction de cela.
Voici un petit schéma pour illustrer la procédure sous Code::Blocks :
Pour Dev-C++, la procédure est quelque peu différente, mais le principe reste le même, dans le menu
Projet ->
Options du projet -> onglet
Paramètres :
Notez qu'ici j'ai rajouté -D devant le nom de notre macro GLEW_STATIC, c'est parce que Dev-C++, contrairement à Code::Blocks, ne le rajoute pas automatiquement.
Et à quoi il sert ce -D ?
C'est une commande du compilateur, comme -Wall ou comme -lSDL

Ça veut dire en quelque sorte #define. Vous pouvez aussi donner une valeur à une macro que vous définissez, comme ceci : -DMA_CONSTANTE=2
Et le linker ?
On y touche pas, on garde celui que Kayl a montré dans son tutoriel, à savoir :
| Code::Blocks | Dev-C++ |
|---|
mingw32
SDLmain
SDL
opengl32
glu32 |
-lmingw32
-lSDLmain
-lSDL
-lopengl32
-lglu32 |
Notez que GLU (glu32) est facultatif, liez-le uniquement si vous l'utilisez.
Et voilà, votre projet est maintenant prêt à utiliser GLEW. En parlant d'utiliser GLEW, vous ne savez toujours pas comment il s'utilise, eh bien nous allons voir ça
GLEW côté programmation
GLEW est une bibliothèque très simple d'utilisation comme nous allons le voir

En fait, elle ne "s'utilise" pas vraiment, il suffit juste de l'initialiser et alors vous pourrez utiliser les extensions d'OpenGL librement sans vous soucier de leur chargement.
Initialisation de GLEW
Etape très importante, c'est ici que serons effectués des "GetProcAddress" comme nous en avons fait avec la SDL. Si vous n'initialisez pas GLEW, votre programme plantera.
Pour initialiser GLEW, rien de particulier : une petite fonction est faite pour ça :
Code : C
Le type de la valeur de retour (GLenum) est un entier non signé, il est défini comme ceci : typedef unsigned int GLenum;
Comme toute initialisation, celle de GLEW peut échouer, d'où la valeur de retour.
La valeur de retour, parlons-en justement, c'est en fait un code d'erreur qui peut être analysé pour savoir si un problème est survenu ou non.
Nous allons récupérer ce code d'erreur dans une variable, nous analyserons ensuite cette variable pour savoir si elle représente un code d'erreur, si elle en représente un, nous la donnerons à manger à une fonction de GLEW qui nous retournera un message. (sous forme de chaîne de caractères)
Code : C1
2
3
4
5
6
7
8
9 | GLenum code;
/* initialisation de GLEW */
code = glewInit();
if(code != GLEW_OK)
{
fprintf(stderr, "impossible d'initialiser GLEW : %s\n",
glewGetErrorString(code));
}
|
Deux choses sont à noter :
- premièrement, la constante utilisée pour savoir si code représente un code d'erreur ou non. GLEW_OK représente donc une valeur de retour qui sera employée si aucune erreur est survenue lors de l'initialisation ;
- deuxièmement, la fonction glewGetErrorString(), qui retourne un message d'erreur d'après un code donné. Cette fonction renvoie un const unsigned char*.
Important : tout comme avec le chargement manuel des extensions (via SDL_GL_GetProcAddress()), le contexte doit avoir été créé avant que vous puissiez initialiser les extensions via la fonction glewInit(). Donc, appelez glewInit() après SDL_SetVideoMode(), sinon glewInit() vous renverra un code d'erreur (Missing GL Version).
Voilà pour l'initialisation.
Utilisation de GLEW
Rien de particulier à faire, sachez juste qu'à présent vous avez accès à toutes les fonctions de toutes les extensions supportées par votre matériel
En parlant d'extension supportée, si vous utilisez GLEW, préférez la fonction
glewIsSupported() pour vérifier si une extension est supportée :
Code : C1 | GLboolean glewIsSupported(const char *name);
|
- name : nom de l'extension recherchée.
Cette fonction renvoie GL_TRUE (qui vaudra 1 généralement) si l'extension est supportée, GL_FALSE (0) sinon. Notez que cette fonction attend le
nom d'une extension sous forme d'une chaîne de caractères, "GL_ARB_multitexture" par exemple.