OpenGL : Présentation

1. OpenGL : Quoi qu'est-ce ?

1.1 Qu'est-ce qu'OpenGL ?

Si vous êtes le propriétaire d'un certain système d'exploitation nommé Windows, vous aurez probablement vu quelques écrans de veille pompeusement appelés 'écrans de veille OpenGL', qui affichent de magnifiques animations 3D, comme une boite changeant de forme, ou des canalisations parcourant l'écran dans tous les sens (mais pourquoi des canalistations, bordel ?). Hé bien OpenGL, c'est la librairie qui permet d'aboutir à ces screensavers (pardon, écrans de veille) hyper évolués. Mais sachez qu'OpenGL n'est pas un petit machin pourri servant juste à faire des anims pourries. Non, en fait OpenGL est une librairie graphique 3D très évoluée et totalement portable offrant de nombreuses ressources aux programmeurs cherchant à faire de la synthèse d'images (pour les jeux par exemples). 

1.2 OpenGL vs Direct 3D

Direct3D est grosso-modo la même chose qu'OpenGL, sauf que c'est une librairie spécifique à Windows, gérée uniquement par Microsoft (OpenGL est gérée par un consortium d'entreprises du secteur), et que la manière de la programmer est relativement différente.
A tous les idiots qui vous disent que l'une est plus performante que l'autre, rétorquez que ce qui fait la performance des API 3D aujourd'hui c'est la carte graphique utilisée et, dans une certaine mesure, les drivers.
 

2. OpenGL : Principe

Bon, maitenant que vous savez ce qu'est réellement OpenGL, voyons comment ca fonctionne à l'intérieur, et tout d'abord, comment il peut être si totalement portable. 

2.1 OpenGL : Le pourquoi du comment de la portabilité

En fait, si OpenGL est 100% portable avec tous les systèmes d'exploitation, c'est tout simplement parce que ce n'est pas lui qui se charge de l'affichage. Hé oui ! Ca peut peut-être sembler bizarre pour une librairie graphique, mais en fait non. Et c'est aussi la raison pour laquelle OpenGL est obligé de s'appuyer sur un système d'exploitation ayant une interface graphique. Je m'explique : en fait, OpenGL sert d'intermédiaire entre le programme et le système d'exploitation, en triturant et traduisant les informations données par le programme et en les envoyant au système d'exploitation. Plus précisément, expliquons le boulot à faire par le programmeur pour initialiser OpenGL : tout d'abord, il doit initialiser un environnement graphique dans le système d'exploitation (c'est-à-dire une fenêtre, dans le cas de Windows). Cette fenêtre sera définie de manière unique par un Device Context, une sorte de handle qui permet au programme d'accéder à cette fenêtre et de lui faire subir toutes les opérations d'affichage possible (affichage de pixels, etc...). Ensuite, le travail sera d'associer à ce Device Context un Rendering Context, qui va permettre à OpenGL de s'adresser à la fenêtre pour lui envoyer ses ordres de dessin. Avec un shéma ca ira mieux :

Programme  »  OpenGL  »  Rendering Context  »  Device Context  »  Affichage
Géré par le programme Géré par l'OS

Voila pourquoi OpenGL est si portable : il se contente de mixer les infos et de les balancer à l'OS. A lui enuite de les afiicher. La seule contrainte pour l'OS est donc de pouvoir dialoguer avec OpenGL. Ceci est par exemple possible sous Windows grâce au driver opengl32.dll disponible dès installation et qui s'occupe de la traduction des données OpengGL en données compréhensible pour la carte vidéo. Et c'est là qu'intervient l'accélération matérielle. Car OpenGL est désormais accéléré matériellement par toutes les cartes graphiques actuelles. Pour obtenir donc que vos programmes OpenGL soient accélérés par votre carte 3D, il suffit de remplacer l'opengl32.dll de base, qui fait du rendu software, par un opengl32.dll traduisant les données OpenGL en données directement compréhensible par la carte 3D, c'est-à-dire en clair installer les drivers de votre carte 3D.
Mais ce mode de fonctionnement impose intrinsèquement une contrainte pour le programmeur : il doit d'abord initialiser l'affichage à travers l'OS (c'est-à-dire créer une fenêtre pour récupérer un Device Context) pour initialiser OpenGL. Et ca c'est encore pas trop lourd sous Windows, mais c'est du masochisme sous X. Heureusement, il existe une librairie, nommée glut, qui perment de faire tout ca sans se préoccuper de l'OS, ce qui rend le code 100% portable. Pour ma part, je trouve cette librairie pas très pratique, surtout lorsqu'on est en train de développer. De plus, comme nous allons voir uniquement la programmation sous Windows, la création de la fenêtre ne devrait pas être trop dure. Mais vous pourrez trouver beaucoup d'infos sur glut sur internet et vous en servir par la suite si ca vous chante. Sachez cependant qu'il est préférable de débuter sans glut car cela permet d'avoir une meilleure appréhension du fonctionnement d'OpenGL (enfin c'est mon avis).

 

2.2 OpenGL : les bases

OpenGL est axé selon un principe de primitives : chaque objet est composé d'éléments basiques comme les sommets, les faces, etc..., appelés primitives. Pour créer un objet, il suffit donc de lui indiquer toutes ses primitives. Par exemple, une face carrée sera générée de cette façon :

glBegin(GL_QUADS);
glVertex3f(1.0,1.0,0.0);
glVertex3f(0.0,1.0,0.0);
glVertex3f(0.0,0.0,0.0);
glVertex3f(1.0,0.0,0.0);
glEnd();

Et voilà c'est tout ! Avouez quand même que c'est simple, clair, lisible, basique... bref : c'est génial !

 

3. Où télécharger OpenGL ?

Pour programmer en OpenGL, il faut posséder les headers (fichiers .h) et les librairies qui les accompagnent (.dll et .lib pour windows, .sl ou .a pour unix...). Je ne peux pas vous fournir les librairies Unix ou Mac, tout simplement parce que je ne les ai pas, mais par contre je peux vous aider à trouver les librairies Windows. Tout d'abord, il faut savoir qu'OpenGL sans glut est directement inclus dedans à partir de la version 95 OSR2. glut n'est inclus dans aucune des versions de windows. Bref, de toute façon, toutes les librairies OpenGL pour tous les systèmes sont disponibles sur le site officiel d'OpenGL : www.opengl.org. J'en profite au passage pour balancer quelques autres liens sympas, bien qu'anglophones : NeHe (bons tutorials en anglais), www.xmission.com/~nate/opengl.html (autres tutorials par un créateur d'OpenGL), reality.sgi.com/mjk/ (plein plein de liens - anglais, évidemment - par un des créateurs d'OpenGL et de GLUT), reality.sgi.com/mjk/tips (les trucs pour faire de la modélisation avancée - ombrages, transparence... - par le même auteur). Pour ceux qui n'auraient pas compris, les fichiers .h sont à copier dans le répertoire include/ du compilateur, les fichiers .lib dans le répertoire lib/, et les .dll dans le répertoire système de windows. Attention cependant à opengl32.dll : ce driver dépend de votre carte 3D (si vous n'en avez pas, c'est un driver software), et si c'est un mauvais driver (genre MiniGL qui ne fonctionne qu'avec Quake III), mieux ne vaut pas écraser l'ancien. Le truc : le copier dans le répertoire de votre programme OpenGL, comme ça votre programme utilisera ce driver, et les autres programmes tourneront avec le driver système. Pour avoir les derniers drivers de votre carte 3D, il y a un très bon site : www.glsetup.com (tous les drivers windows complets pour toutes les cartes). GLSetup est également présent sur certains jeux utilisant OpenGL (HomeWorld par exemple). 

4. OpenGL : Récapitulation

Qu'est-ce qu'on a appris ici ? Hé bien qu'OpenGL c'est bien, que c'est carrément portable, que l'on crée des objets à partir de leurs primitives, qu'il faut savoir un petit peu parler le langage de son OS, et qu'en gros un programme dessinant en OpenGL se structure à peu près comme ça :

  • Création d'une fenêtre
  • Récupération d'un Device Context pour cette fenêtre
  • Récupération d'un Rendering Context pour ce Device Context
  • Initialisation d'OpenGL à l'aide de ce Rendering Context
  • ...
  • Création d'objets à partir de primitives simples
  • Affichage des objets
  • ...
  • Libération du Rendering Context
  • Libération du Device Context
  • Fermeture du programme
Antoche
 


← FAQ↑ Tutoriaux OpenGL ↑Initialiser OpenGL avec Windows →