OpenGL

Construire la fenêtre de rendu et les bases du programme

Objectif

L'objectif est de créer et de configurer la fenêtre de rendu, à partir de trois éléments :


La Fenêtre

L'utilisation de la classe Frame d'AWT suffit amplement pour créer la fenêtre de rendu. Sur cette objet, il ne faudra pas oublier de définir la taille de la fenêtre (size()) et de l'afficher (setVisible()).

Il est possible d'utiliser l'objet JFrame de Swing, comme alternative à l'objet Frame. Une JFrame apporte plus de fonctionnalités que la Frame d'origine, mais elle apporte moins de performances sur l'affichage du rendu (détail négligeable, selon les besoins).


Le Canvas

La bibliothèque JOGL possède la classe GLCanvas qui est une canvas dédiée aux rendus OpenGL. Après avoir initialisé l'objet, il faudra l'ajouter, en tant que composant AWT, à la fenêtre Frame.

Après que l'application a démarré, le canvas n'aura pas le "focus" (qui est nécessaire pour les entrées souris et clavier). Pour récupérer le focus au démarrage, il faut faire appel à la méthode requestFocus(), après que la Frame soit visible.


L'interface GlEventListener

GLEventListener est une interface qui étend d'EventListener. Elle regroupe des méthodes abstraites pour paramétrer les états d'OpenGL, la perspective de la scène, et générer un rendu. Ces méthodes sont automatiquement invoquées par l'objet GLCanvas.

A partir de cette interface, nous devons redéfinir 4 méthodes :

Chacune de ces méthodes ont comme paramètre l'objet GLAutoDrawable, qui représente le contexte. A partir de ce paramètre, nous pouvons récupérer un objet OpenGL (de classe GL2).

Nous développerons ces méthodes au fur et à mesure du tutoriel.

Après avoir créé un objet GLEventListener, il faut l'enregistrer auprès du canvas via la méthode addGLEventListener().


Terminer correctement l'application

Il reste un dernier point à traiter avec ces 3 objets : Il est conseillé de terminer "proprement" l'application, étant donné qu'OpenGL et la bibliothèque JOGL utilisent des ressources systèmes. La solution la plus simple est d'utiliser la méthode dispose() de la Frame qui se chargera de détruire ses composants, dont le canvas. Lors de la destruction de la canvas, ce dernier va faire appel, automatiquement, à la méthode dispose() de GLEventListener, et videra les ressources utilisées par l'API graphique.

Il est utile d'utiliser un objet WindowAdapter, afin d'invoquer la méthode dispose() lors de la fermeture de la fenêtre.


Le code produit

// Fenêtre
final Frame frame = new JFrame("Hello OpenGL!");
frame.setSize(640, 480);

// Canvas
GLCanvas canvas = buildCanvas(frame);
frame.add(canvas);

// GlEventListener
GLEventListener glel = new Cube();
canvas.addGLEventListener(glel);

// Lors de la fermeture de l'application
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
frame.dispose();
System.exit(0);
}
});

frame.setVisible(true);
canvas.requestFocus();

Nous définirons la classe Cube, qui implémente l'interface GlEventListener, dans les prochaines parties.

Dans la prochaine partie, nous allons paramétrer le rendu de l'application, grâce aux états et à la perspective de la scène.