OpenGL avec GtkGLArea
Par Xavier Michelon


 
   
GTK et OpenGL

Par défaut, GTK ne propose pas de widget OpenGL. Mais pour palier ce manque, un généreux développeur nommé Janne Löf a créé GTKGLArea, qui propose un nouveau widget dérivé de GtkDrawingArea permettant d’insérer des fenêtres OpenGL dans vos interfaces GTK. Vous trouverez GTKGLArea à l’adresse indiquée en référence [9]. Notez que vous aurez besoin de GTK en version 1.2 minimum.

A l'attaque

Pour illustrer ce didacticiel, je vous propose de créer une application GTK toute simple affichant un cube en 3D (figure 1). Je sais, je vous avais promis il y a quelques temps de ne plus vous reparler de cube. Si je reviens sur ma promesse, c’est tout simplement pour garder un code source concis et ne pas avoir à utiliser les primitives géométriques standard de Glut. Comme d’habitude, vous pourrez faire tourner le cube avec la souris (bouton gauche) et zoomer (bouton droit). Pour le changement du mode d’affichage, nous utiliserons des boutons GTK en lieu et place de nos habituels raccourcis clavier.

Si vous jetez un coup d’œil au code source de  notre programme, vous vous rendrez compte  que l’architecture globale est finalement peu différente de ce que nous avions avec glut. On se retrouve avec un système événementiel où un certain nombre de fonctions de rappel sont associées aux différents événements pouvant survenir (création de la fenêtre, clic de souris, appui sur un bouton…).

Initialisation

La phase d’initialisation d’OpenGL permet, je vous le rappelle, de définir les paramètres de base nécessaires au bon fonctionnement de l’application OpenGL : paramètres de perspective, d’éclairage, de couleur… Lorsque nous utilisions Glut, nous avions l’habitude d’appeler depuis la fonction main() une procédure InitOpenGL(). Avec GTKGLArea, il va falloir agir différemment. La raison est simple : pour initialiser OpenGL, il est nécessaire de disposer d’une fenêtre (au sens X-Window du terme) à laquelle sera attaché le contexte OpenGL. Dans le cas de Glut, cette fenêtre est créée avant l’appel à InitOpenGL par la fonction glutCreateWindow(). Mais avec GTK, la fenêtre n’est effectivement créée que lors de l’appel à gtk_widget_show().

La solution pour remédier à ce problème est simple : il suffit d’attacher la fonction d’initialisation d’OpenGL au signal ‘realize’ qui sera émis lors de la création de la fenêtre.