Professional Documents
Culture Documents
-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Généralités
Comment participer à cette FAQ ?
Auteurs : Laurent Gomila ,
OpenGL étant une API en constante évolution, nous comptons sur vous pour enrichir cette FAQ et participer à sa
maintenance. Si vous avez remarqué une erreur, une simple faute d'orthographe, si vous souhaitez nous faire part d'un
manque, ou n'importe quoi d'autre : vous pouvez contacter le responsable par MP (loka), ou poster à la suite de ce
sujet consacré à la FAQ OpenGL.
Merci !
Si vous ne trouvez de réponse à votre question dans aucune FAQ, et que celle-ci vous paraît pertinente, vous pouvez
nous en faire part afin que nous l'ajoutions à cette FAQ. Voir Comment participer à cette FAQ ?.
Qu'est-ce qu'OpenGL ?
Auteurs : shenron666 , Laurent Gomila ,
OpenGL (pour Open Graphics Library) est une bibliothèque portable de rendu graphique 2D et 3D créée en 1992 par
SGI (Silicon Graphics) : http://www.sgi.com/.
Elle se compose de plusieurs centaines de fonctions qui permettent au programmeur la création d'images de haute
qualité. OpenGL est utilisé dans de nombreux domaines, aussi bien dans les moteurs de jeux vidéo (la série Quake est
un bon exemple), dans des logiciels de modélisation 3D professionnels payants (3D Studio Max, Lightwave) ou gratuits
(Blender), ou encore dans l'imagerie médicale.
OpenGL est maintenu par un groupe indépendant : l'ARB (Architecture Review Board), composé des plus grands acteurs
du marché (Compaq, Microsoft, SGI, IBM, 3DLabs, HP, Intel, Evans & Sutherland). C'est l'ARB qui contrôle donc les
propositions d'évolution de l'API, les étudie et les approuve.
• La portabilité au niveau de la plateforme : il existe des implémentations d'OpenGL pour Windows, Linux,
Mac... Il est possible de créer un programme sur un système et ensuite faire tourner ce même programme sous
un autre système.
• La portabilité au niveau du hardware : chaque vendeur de carte graphique pouvant ajouter ses propres
extensions, il est tout à fait possible avec OpenGL de créer des programmes qui ne tournent que sur un type
de carte graphique donné. De même, un programme tournant sur une génération de carte a peu de chances
-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
de tourner sur une génération plus ancienne si jamais elle utilise des extensions apportées par la nouvelle
génération. Pour éviter les problèmes de portabilité entre cartes graphiques, il est donc conseillé de n'utiliser
que les extensions ARB ou EXT (bien que les extensions EXT ne garantissent pas d'être presentes sur toute les
cartes, elle sont généralement implementées par la plupart).
Tutoriels en français
C et C++ :
•
GLInFrench : cours généraux
•
LinuxGraphic : didacticiels divers
•
G-Truc : nombreux tutoriaux OpenGL divers
•
Ze zglut code depot : projets OpenGL avec code source
•
Principes et astuces : trucs et astuces OpenGL
•
Guide du routard OpenGL : tutoriels de base pour OpenGL 1.2
Delphi
-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
•
DelphiPage : Introduction à OpenGL avec Delphi
•
Installer GLScene9 dans Delphi 2005
•
OpenGL avec Delphi
Tutoriels en anglais
•
NeHe Productions : articles, tutoriels, liens, ... la référence pour développer avec OpenGL
•
CodeSampler : codes sources
•
Nate Robins : programmes-tutoriels
•
LightHouse 3D : tutoriels avancés
•
Le site developpeur de nVidia : pas mal de choses sur la programmation 3D, les techniques récentes, les
outils et SDK nVidia, des articles, des tutoriels, des démos, ...
•
Le site developpeur de ATI : même chose que chez nVidia, codes sources, démos, outils, articles, ...
•
Humus : démos avancées avec code source inclus
•
Advanced Graphics Programming Techniques Using OpenGL : techniques avancées avec OpenGL
(présentation SIGGRAPH `98)
•
Paul's projects : codes sources avancés
•
Delphi OpenGL Projects : projets OpenGL réalisés en Delphi
• L'accès en ligne au manuel de référence OpenGL : The OpenGL Reference Manual (Bluebook)
• L'accès en ligne au guide de programmation OpenGL : The OpenGL Programming Guide (Redbook)
• Les spécifications de toutes les versions d'OpenGL : http://opengl.org/documentation/spec.html
• La documentation sur toutes les extensions OpenGL ainsi que la dernière version de l'en-tête pour les exploiter :
http://oss.sgi.com/projects/ogl-sample/registry/
• La documentation du système de shaders : http://opengl.org/documentation/oglsl.html
• Les implémentations pour les différentes plateformes supportées : http://opengl.org/documentation/
implementations.html
-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Pour obtenir la modèle de la carte :
glGetString(GL_RENDERER)
glGetString(GL_VENDOR)
glGetString(GL_VERSION)
glGetString(GL_EXTENSIONS)
Pas de panique cependant : vous pourrez bien entendu utiliser les fonctionnalités des versions supérieures, pour cela il
suffit de les charger dynamiquement via le système d'Comment charger une fonction liée à une extension ?.
-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Généralités > OpenGL et les autres langages / bibliothèques
Qu'est-ce que AUX ?
Auteurs : Zoso_ ,
Tout comme Qu'est-ce que GLUT ?, AUX s'occupe des opérations relatives au système de fenêtrage et à la gestion des
évènements. Son utilisation est trés similaire à GLUT, à tel point qu'il suffit bien souvent de remplacer le préfixe des
fonctions "glut" par "aux" pour retrouver les fonctions correspondantes.
Pour l'utiliser il faut posséder glaux.lib et glaux.h, qui sont livrés la plupart du temps avec les EDI classiques. Cependant
AUX est confiné à un seul système d'exploitation qui se trouve être Windows.
GUI (interface graphique) (apporte une gestion des boutons et autres controles à l'application)
•
SDL_gui : http://www.newimage.com/~rhk/SDL_gui/
•
GLgooey : http://glgooey.sourceforge.net/
•
GLui : http://www.cs.unc.edu/~rademach/glui/
•
SDL_ttf : http://www.libsdl.org/projects/SDL_ttf/
•
Freetype : http://www.freetype.org/
Graphique/Image (apporte des routines de traitement d'images, la gestion des fichiers graphiques)
•
OpenIL (Devil) : http://openil.sourceforge.net/
•
SDL_Image : http://www.libsdl.org/projects/SDL_image/
•
Glew : http://glew.sourceforge.net/
-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
•
OpenAL : http://www.openal.org/
•
SDL_mixer : http://www.libsdl.org/projects/SDL_mixer/
•
SDL_sound : http://icculus.org/SDL_sound/
•
SDL_net : http://www.libsdl.org/projects/SDL_net/
•
HawkNL : http://www.hawksoft.com/hawknl/
•
Tokamak : http://www.tokamakphysics.com/
•
ODE : http://ode.org/
•
NovodeX : http://novodex.com/
FreeGlut : http://freeglut.sourceforge.net/.
OpenGLut : http://openglut.sourceforge.net/.
Adaptations de la bibliothèque GLUT qui n'est plus mise à jour. OpenGLut apporte également des fonctions
supplémentaires aux fonctions de GLUT. Les 2 bibliothèques se veulent compatibles avec la dernière version de GLUT.
Aujourd'hui, de nombreux programmes d'exemple et tutoriaux trouvables sur Internet utilisent GLUT. La majorité
d'entre eux datent et même si GLUT est une bibliothèque stable elle n'est pas approprié à la conception d'un jeu,
notamment par sa mauvaise gestion du mode plein écran.
-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
La bibliothèque SDL est tout aussi facile à programmer, stable et performante, elle a tout pour satisfaire les besoins au
sein de gros projets. Elle a non seulement fait ses preuves avec des adaptations de jeux commerciaux, mais qui plus est
elle est toujours suivie tandis que le développement de GLUT s'est arrêté il y a plusieurs années.
Autre point important, la documentation très complète et plutot bien faite est directement accessible depuis le site
officiel de SDL.
Une version SDL 2.0 plus orientée objet serait en cours de développement, à suivre...
Pour se faire une idée de l'ensemble des langages qui peuvent être utilisés, il suffit de faire un tour sur le site de
NeHe, et de regarder les différentes versions de chaque tutoriel.
Il existe de nombreux tutoriels qui pourront vous aider à intégrer OpenGL aux MFC :
•
OpenGL I : quick start (MSDN)
•
MFC and OpenGL
•
OpenGL MFC GLUT tutorials
•
Setting up OpenGL in an MFC control
•
NeHe OpenGL MFC basecode
•
MFCOGL, un exemple de code OpenGL MFC générique
•
OpenGL et MFC
•
Tutoriels OpenGL utilisant les MFC
Tao est une collection de bibliothèques fonctionnant avec Mono et .NET. Parmi celles-ci : OpenGL, GLU, FreeGlut,
OpenAL, DevIL, SDL, ...
Site web : http://www.mono-project.com/Tao
CsGL (CSharp Graphics Library) est une bibliothèque permettant également d'utiliser OpenGL en .NET.
- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Site web : http://csgl.sourceforge.net/
Tutoriel en français : Programmer OpenGL en CSharp
Pour une utilisation plus poussée, Qt fournit également d'autres classes en relation avec OpenGL dans son module
QGL. Cependant, la classe QGLWidget seule sera suffisante la plupart du temps.
- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Les extensions
Comment fonctionne le système d'extensions d'OpenGL ?
Auteurs : Laurent Gomila ,
Contrairement à DirectX qui n'est développé que par Microsoft et mis à jour tous les deux mois, la standardisation
d'OpenGL est contrôlée par l'ARB, commité composé des constructeurs de hardware les plus importants (voir Qu'est-
ce qu'OpenGL ?). Ainsi, il faut parfois plusieurs mois (voire plusieurs années) avant qu'une nouvelle fonctionnalité soit
intégrée au coeur d'OpenGL.
Afin de pouvoir exploiter sans attendre les nouvelles fonctionnalités du hardware, OpenGL inclut un mécanisme
d'extensions, qui permet d'utiliser certaines fonctions sans qu'OpenGL ne les connaisse.
Utiliser une extension se fait en deux temps : il faut tout d'abord vérifier que l'extension que vous souhaitez utiliser
est bien supportée par votre système (voir Comment savoir si une extension est supportée par mon hardware ?), puis
charger dynamiquement les fonctions associées à celle-ci (voir Comment charger une fonction liée à une extension ?).
Vous pourrez ensuite utiliser vos nouvelles fonctions comme n'importe quelle autre fonction incluse au coeur d'OpenGL.
Attention cependant : la plupart des extensions sont spécifiques à un seul constructeur, et seront inutilisables sur
d'autres types de cartes. Par exemple, celles dont le nom commence par "NV" sont spécifiques aux cartes nVidia, et
celles commençant par "ATI" ne concernent que les cartes ATI. Les extensions "ARB" par contre, ont été officialisées
par l'ARB à partir d'une certaine version d'OpenGL, et tout hardware compatible avec cette version devrait en
théorie supporter ces extensions (par exemple, toutes les cartes compatibles OpenGL 1.5 supportent l'extension
ARB_fragment_program). Pour finir il y a également les extensions "EXT", qui sont à peu près officielles mais n'ont
pas encore été validées par l'ARB.
Enfin, il est important de noter qu'il existe des bibliothèques permettant de faciliter la gestion des extensions, par
exemple GLEW.
Voici un exemple en C++, on vérifie si l'extension correspondant aux textures compressées est supportée :
- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
}
Par exemple, pour charger la fonction glBindBufferARB qui sert à activer un VBO :
// Chargement de la fonction
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
// Utilisation
glBindBufferARB(0);
Toutes les définitions de types et de constantes relatives aux extensions se trouvent dans le fichier glext.h, il vaut donc
mieux avoir une version à jour si vous souhaitez utiliser des extensions récentes (voir Où puis-je trouver la derniere
version de glext.h ?).
Pour faciliter le chargement des extensions et le rendre quasiment transparent, vous pouvez également utiliser
GLEW, une bibliothèque conçue pour faire ce boulot.
Sous Delphi, l'équivalent GLext.pas pourra être trouvé par exemple dans Delphi OpenGL Toolkit (DOT). Son utilisation
est très simple, puisqu'une seule fonction est nécessaire pour charger les fonctions associées à une extension.
- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Passez lui en paramètre le nom de l'extension, elle vérifiera que l'extension est bien supportée et chargera le cas échéant
les fonctions associées.
- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Optimisations
Comment améliorer les performances de mon application OpenGL ?
Auteurs : bafman ,
Il n'existe pas de méthode pré-établie pour améliorer les performances d'un programme tournant sous OpenGL ; tout
dépend de ce que vous voulez lui faire faire exactement. Un moteur 3D destiné à rendre des scène en interieur s'orientera
plutot vers des optimisations du type portal + PVS, alors qu'un moteur créé pour rendre des exterieurs aura plutôt
tendance à s'orienter vers des octrees / quadtrees.
Dans tout moteur 3D en général, la première optimisation n'est pas d'utiliser les commandes les plus rapides pour
afficher, mais bien d'utiliser des algorithmes appropriés pour ce que l'on veut effectuer. Néanmoins d'un point de vue
strictement OpenGL, il existe quelques "bonnes techniques" à utiliser pour ne pas se retrouver limité par des erreurs
de programmation.
La règle de base est de savoir qu'OpenGL est une machine à états, c'est-à-dire que tout état acitvé à un instant T restera
actif durant tous les instants suivants, à moins de désactiver cet état. Ceci implique pour le programmeur de bien savoir
quels états sont actif à quel moment, afin d'utiliser le moins possible de fonctionnalités inutiles.
Un bon exemple de ce qu'il ne faut pas faire est d'utiliser du blending en mode (SRC_ONE, DST_ZERO). En effet,
quand cette fonction de blending est activée, elle n'a aucun effet visible sur le rendu (la scène est rendue exactement
de la même manière que si le blending était désactivé), ce qui signifie que le pipeline OpenGL calcule une opération de
blending sans que cela ait une quelconque influence sur le rendu final. C'est du temps de calcul perdu.
Un autre type d'optimisation est d'utiliser les listes d'affichage (display lists) pour effectuer du batching de commandes
OpenGL (voir qu'est ce que le batching faq 3D). En effet, les listes d'affichage peuvent contenir presque tout type de
commandes OpenGL (avec quelque limitations specifiée dans le Red Book), ce qui permet en un seul appel de commande,
d'effectuer plusieurs opérations OpenGL.
Il existe de nombreux sites sur internet parlant d'optimisation de code OpenGL, le plus documenté étant sûrement le
site de nVidia section "développeurs", qui contient notament un document décrivant les principales erreurs à éviter en
OpenGL : Avoiding common OpenGL pitfalls.
Qu'est ce qui est le plus rapide ? glVertex, display list, vertex array ou VBO ?
Auteurs : bafman ,
Malheureusement la réponse n'est pas évidente, elle est adaptée à chaque type de moteur.
VBO compilé > VBO > vertex array compilé > display list > vertex array > glVertex
Mais malheureusement ceci depend beaucoup du constructeur de la carte graphique, voire même de la version des
drivers. De plus, une mauvaise utilisation d'une des méthodes peut faire perdre beaucoup en rapidité. Par exemple,
compiler un vertex array à chaque frame est plus lent que d'utiliser un vertex array simple, car le driver fait une passe
d'optimisation lors de la compilation qui du coup fait perdre du temps. De même, utiliser une display liste pour un objet
très petit est une mauvaise idée, car l'appel à la display list a un coût important qui sera superieur au coût d'affichage
du même objet avec glVertex.
- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
La seul chose qui soit à peu près sûre, c'est que la methode la plus lente est l'utilisation de glVertex.
Pour connaître le framerate de votre application en temps réel, vous pouvez également utiliser le freeware FRAPS
( http://www.fraps.com).
Des programmes plus poussés ont également été développés afin de tester les performances d'une application OpenGL :
• La page "Benchmarks" du site officiel d'OpenGL fournit une liste des benchs les plus utilisés
• GLTrace (code source fourni)
• glTest est également disponible dans les distributions de GLUT, dans "progs/bucciarelli/gltest.c"
- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Techniques
Comment faire de la 2D avec OpenGL ?
Auteurs : Laurent Gomila ,
OpenGL n'offre aucune fonction destinée à la 2D, du moins pas directement. Il est cependant très simple de faire du
rendu 2D si l'on considère qu'il s'agit de rendu 3D avec un axe fixe.
// On définit une matrice orthogonale pour la perspective, ce qui permettra d'avoir une vue 2D et non en perspec
glMatrixMode(GL_PERSPECTIVE);
glOrtho(left, right, bottom, top, near, far);
// Ou gluOrtho2D(left, right, bottom, top);
Puis, ne pas oublier d'utiliser des fonctions manipulant des coordonnées 2D, comme par exemple glVertex2f() au lieu
de glVertex3f().
1- Positionner les paramètres de blending sur GL_ZERO, GL_ONE. Cela fonctionne mais est coûteux (les fragments
sont tout de même traités), et cela risque d'interférer avec le blending utilisé dans certains autres effets.
glBlendFunc(GL_ZERO, GL_ONE);
En positionnant tous les paramètres à GL_FALSE, cette fonction désactive l'écriture dans le color buffer tout en
continuant à écrire dans les autres buffers (stencil, depth).
- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
glDepthMask(GL_TRUE);
Si votre image ne possède pas de canal alpha mais plutôt une couleur que vous souhaitez rendre transparente, vous
pouvez très bien parcourir les pixels de celle-ci et affecter manuellement les valeurs alpha selon la couleur des pixels.
Une fois la texture correctement munie d'un canal alpha, il existe deux solutions pour activer la transparence. Comme
expliqué dans la FAQ 3D ( "Comment avoir une texture trouée"), le meilleur moyen est d'activer l'alpha-test.
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.0f);
/* Dessin du sprite avec transparence */
glDisable(GL_ALPHA_TEST);
Ici, nous paramètrons l'alpha-test pour qu'il ne garde que les pixels ayant une valeur alpha strictement supérieure 0.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* Dessin du sprite avec transparence */
- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
glDisable(GL_BLEND);
Ceci-dit cette méthode a plusieurs inconvénients : premièrement les sprites devront être triés d'arrière en avant, de plus
ce ne sera pas aussi performant que l'alpha-test.
Par contre aucun mécanisme n'est fourni pour enregistrer l'image récupérée dans un fichier, pour cela il vous faudra
passer par une bibliothèque tierce (voir Quelles bibliothèques utiliser avec OpenGL ?).
Attention : récupérer les pixels du color buffer est une opération très lente et à n'utiliser que dans cette optique.
N'envisagez par exemple pas d'utiliser ce mécanisme pour effectuer des traitements en temps réel.
La première est d'utiliser un format ASCII simple à décortiquer (ASE par exemple) et de coder un loader capable de
charger ce format. Le site des formats de fichiers fournit une description détaillée de la plupart des formats existant ;
si jamais vous n'y trouviez pas le vôtre alors pensez à Google.
Game Tutorials propose également de nombreux tutoriels permettant de charger les formats les plus courants (3DS,
OBJ, ASE, MD2, MD3), mais il faudra payer pour accéder à ceux-ci...
Un format spécialement conçu pour OpenGL a également vu le jour : il s'agit de XGL. Suivant une syntaxe XML, il
est très facile à manipuler ; il est également prévu pour pouvoir stocker n'importe quelle information utilisable par
OpenGL.
Sa page officielle fournit les spécifications du format, des exemples, des liens, des modèles, et même un convertisseur
3DS -> XGL.
A noter que la distribution de GLUT contient un code source permettant de charger les fichiers au format OBJ (voir
progs/demos/smooth/glm.c).
La seconde solution est d'utiliser un programme permettant de convertir un modèle directement en code C, contenant
les appels OpenGL permettant de construire et d'afficher le modèle. Cette alternative est toutefois déconseillée dans le
sens où elle n'est absolument pas flexible : pour afficher un nouveau modèle il faudra en effet recompiler l'application.
Quelques logiciels proposent cette conversion, par exemple PolyTrans ou encore 3D Exploration.
- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Enfin, pour les plus courageux, il est bien sûr possible de concevoir un format de modèles perso. Deux solutions pour
créer les modèles : coder des scripts d'exportation pour votre logiciel de modelisation préféré (pas forcément évident...),
ou coder un convertisseur à partir d'un format existant (mais dans ce cas autant utiliser ce format directement).
Pour plus d'informations sur les formats à utiliser n'ayant pas de lien avec OpenGL, vous pouvez consulter Quel
format de modèle 3D utiliser ?.
Utilisation de bitmaps ou pixmaps La manière la plus classique d'afficher du texte avec OpenGL est l'utilisation de
glBitmap() ou glDrawPixels() pour chaque caractères. Le résultat est un simple texte 2D qui convient dans la majorité
des cas. Préfèrez glBitmap() à glDrawPixels() car ce dernier est bien plus lent. Généralement, chaque appel à glBitmap(),
un pour chaque caractère, est placé dans une display list, qui est indexé par sa valeur de caractère ASCII. Ensuite, un
appel à glCallLists() permet d'afficher un chaîne entière de caractères.
Vous pouvez aussi utiliser des fonctions propres à certains toolkits et API comme glXUseXFont() pour le serveur X,
wglUseFontBitmaps() pour Windows ou encore glutBitmapCharacter() pour GLUT.
Par texture mapping Dans beaucoup d'implémentations OpenGL, glBitmap() et glDrawPixels() sont très lents par
rapport à un carré texturé. Utilisez dans ces cas là cette solution. L'idée est de créer une texture qui contient tous les
caractères d'une police (ou au moins ceux qui seront affichés). Pour afficher un charactère, dessinez un carré texturé,
avec les coordonnées de la texture configurées pour séléctionner le charactère voulu dans la texture. Vous pouvez aussi
jouer avec la valeur alpha pour désactiver le fond de la police.
Voilà les deux méthodes les plus classiques pour afficher du texte dans une scène OpenGL. Ces méthodes sont applicables
dans de nombreux contextes (langages, plateformes, OS..). Cependant, si le résultat obtenu ne vous convient pas (si vous
souhaitez avoir des polices 3D etc..), il existe des solutions plus techniques. Cependant la plupart de ces solutions sont
propres à une API ou à un système d'exploitation.
Pour la création d'images pour les textures, il existe sur internet de petits programmes vous les générant. Vous pouvez
cependant coder votre propre FontFactory.
Si vous utilisez Java, n'hésitez pas à faire appel aux API du JDK et plus particulièrement à Java2D qui vous facilitera
grandement la tâche.
Il existe aussi des bibliothèques vous facilitant grandement l'affichage de texte avec OpenGL :
• FNT
• GLTT
• OGLFT
- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
lien : Texture mapped fonts
Une technique intéressante est de regrouper les images dans une unique texture et de s'en servir comme meta-texture.
En utilisant les paramètres passés à la fonction glTextureCoord2f, on peut sélectionner les parties de la meta-texture
afin d'avoir la texture que l'on cherche.
Une question qui peut se poser est de savoir comment gérer ce genre de meta-texture, surtout lorsque la texture que
l'on veut se compose aussi de sous-parties.
- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Lorsqu'on avait une seule texture A, on faisait :
glBindTexture(GL_TEXTURE_2D, index_de_la_texture_A);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f); /* coin haut-gauche */
glTexCoord2f(0.5f, 1.0f);
glVertex3f( 1.0f, 1.0f, 0.0f); /* coin haut-droit */
glTexCoord2f(0.5f, 0.5f);
glVertex3f( 1.0f, -1.0f, 0.0f); /* coin bas-droit */
glTexCoord2f(0.0f, 0.5f);
glVertex3f(-1.0f, -1.0f, 0.0f); /* coin bas-gauche */
glEnd();
Mais avec la texture C, qu'est-ce qui change ? Déjà la fonction glBindTexture va devoir charger la texture C, mais les
arguments de glTexCoord2f changent également... C'est là où avoir un gestionnaire de texture est pratique. Il suffit
d'avoir un gestionnaire qui nous donne les coordonnées et l'indice de la texture que l'on cherche.
Lorsque je veux afficher mon carré noir, mon programme a son propre indice pour savoir que je veux cette partie.
Pourquoi ? Parce que rien n'oblige OpenGL à redonner à chaque exécution les mêmes indices de textures (c'est pour
cela qu'on utilise glGenTextures).
Donc pour lorsque je veux avoir l'indice OpenGL d'une texture, rien ne vaut un gestionnaire central des ressources
(voir ce tutoriel sur la gestion des ressources).
Pour revenir à notre problème, nous avons donc un gestionnaire de texture à qui nous pouvons dire :
tex = gestionnaireTextures.getTexture(indice_carre_noir);
Qu'est-ce que nous mettons dans tex ? Les coordonnées de la sous-texture voulue dans la meta-texture.
Les coordonnées seront données par position du coin inférieur gauche (comme en OpenGL le coin inférieur gauche est
donné par les coordonnées (0.0,0.0)) et (largeur / hauteur). Donc une structure de ce type :
- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
} STexture;
Finalement, notre code de départ doit être modifié ; en effet, nous devons prendre en compte la position de la sous-
texture. La transformation de code se fera en deux étapes. Pour la première, nous allons enlever les coordonnées écrites
en hard et passer par des variables :
glBegin(GL_QUADS);
glTexCoord2f(gauche, haut);
glVertex3f(-1.0f, 1.0f, 0.0f); /* coin haut-gauche */
glTexCoord2f(droite, haut);
glVertex3f( 1.0f, 1.0f, 0.0f); /* coin haut-droit */
glTexCoord2f(droite,bas);
glVertex3f( 1.0f, -1.0f, 0.0f); /* coin bas-droit */
glTexCoord2f(gauche, bas);
glVertex3f(-1.0f, -1.0f, 0.0f); /* coin bas-gauche */
glEnd();
Ensuite, pour prendre en compte la position dans la meta-texture, il suffit de modifier le calcul fait aux variables gauche,
droite, haut et bas.
Dans notre cas (si nous voulions la sous-texture A), nous aurions comme valeurs :
tex.begx = 0.0;
tex.begy = 0.0f;
tex.haut = 1.0f;
tex.larg = 0.5;
glBegin(GL_QUADS);
glTexCoord2f(gauche, haut);
glVertex3f(-1.0f, 1.0f, 0.0f); /* coin haut-gauche */
glTexCoord2f(droite, haut);
glVertex3f( 1.0f, 1.0f, 0.0f); /* coin haut-droit */
glTexCoord2f(droite,bas);
glVertex3f( 1.0f, -1.0f, 0.0f); /* coin bas-droit */
glTexCoord2f(gauche, bas);
glVertex3f(-1.0f, -1.0f, 0.0f); /* coin bas-gauche */
glEnd();
En effet, n'oublions pas que nous avons fait cela pour limiter les appels à la fonction glBindTexture. Le plus simple est
de laisser le gestionnaire le faire. Nous lui demandons de le faire, et il pourra vérifier si la sous-texture que nous voulons
est déjà en place (si elle se trouve dans la meta-texture déjà chargée). Si ce n'est pas le cas, le gestionnaire la charge.
Finalement, si vos sous-textures sont mises ensemble de façon optimale, il est possible de faire tenir en une seule meta-
texture toutes les textures d'une scène.
- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Voilà, vous savez maintenant utiliser une meta-texture et la gérer correctement.
La première solution est de prendre votre programme de dessin favori, ouvrir les deux textures qui vous intéresse et
les mettre ensemble pour former une texture plus grande.
Un exemple est donné dans la question Comment et pourquoi utiliser une meta-texture?.
La deuxième technique est de créer virtuellement cette texture en juxtaposant les images lorsqu'elles sont chargées en
mémoire. Lorsque le programme se charge, il va demander à un gestionnaire de ressource de charger plusieurs textures.
Le gestionnaire ne va pas les charger individuellement mais va les mettre ensemble pour former des meta-textures. Ceci
est bien sûr fait pour limiter le nombre d'appels à glBindTexture.
• Charger la texture
• Récupérer les coordonnées d'une texture
• Faire appel à la fonction glBindTexture, s'il le faut
Lorsqu'on charge une image, avant de la donner à OpenGL, on la stocke dans un tableau contenant les couleurs rouge,
vert et bleu de chaque pixel. Il est donc facile de garder ce tableau et de le concaténer avec une autre texture avant de
passer ce nouveau tableau à la fonction glTexImage2D.
Un tel rendu n'est pas disponible directement avec les fonctionnalités d'OpenGL. En effet, cela dépend du contexte
d'affichage et non de l'API ne elle-même, ce qui est donc dépendant du système d'exploitation.
Voici un lien expliquant comment réaliser un rendu offscreen sous différents systèmes : OpenGL/Mesa off-screen
rendering.
- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Habituellement, on utilise le mode de rendu GL_SELECT fourni par OpenGL, qui permet d'identifier instantanément
quel objet se trouve sous un point de l'écran.
Voici quelques tutoriels expliquant comment utiliser le mode GL_SELECT :
- Picking tutorial
- Sélection et picking avec OpenGL
La première méthode alternative consiste à transformer les coordonnées 2D du point dans l'espace 3D. Pour cela il
suffit de lui faire subir les transformations inverses de celles qui sont appliquées aux objets 3D, ce qui donnera un rayon
(et non un point unique, puisqu'on ajoute une dimension). Il suffira ensuite d'effectuer des tests d'intersection entre ce
rayon et les objets de la scène afin de déterminer lequel se trouve sous le pointeur. La fonction gluUnproject permet
de générer facilement un tel rayon.
Une autre méthode est d'effectuer un rendu de la scène en assignant à chaque objet une couleur unique et constante,
puis d'aller lire dans le back buffer la couleur du point en question, ce qui vous donnera instantanément l'identifiant
de l'objet que vous recherchez.
Voici tout de même un tutoriel de NeHe expliquant comment lire une vidéo dans une texture sous Windows :
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=35.
La première, que l'on voit souvent dans la littérature, est d'utiliser les parametres suivants :
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_LINE_SMOOTH);
Cette méthode est à éviter à tout prix. En effet pour avoir un anti-alising correct avec cette méthode, il faut :
Une autre méthode présentée est d'utiliser le tampon d'accumulation, puis de rendre la scène plusieurs fois en modifiant
légèrement la position de la caméra. Bien que moins contraignante d'un point de vue structure de données, cette méthode
est aussi à éviter car elle est très consommatrice de ressources (plusieurs rendus pour une même scène...).
- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
la dernière méthode, utilisée dans les jeux vidéo, consiste à utiliser le Comment activer le multi-sampling ? qui permet
d'avoir un anti-aliasing de qualité pour un coût de traitement moindre.
Sous GLUT, il suffit de passer le paramètre GLUT_MULTISAMPLE lors de l'initialisation du contexte. Par exemple :
Enfin, avec l'API Win32, le code est un peu plus long mais est très bien décrit dans ce tutoriel de NeHe : Leçon 46.
- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > Problèmes
Pourquoi ma lumiere n'éclaire-t-elle pas mon polygone quand je lui applique une texture ?
Auteurs : bafman ,
Généralement, c'est que la texture est mise en mode REPLACE au lieu de MODULATE.
En mode REPLACE, OpenGL ne prend en compte lors de l'affichage que la couleur de la texture, alors qu'en mode
MODULATE, la couleur de la texture est multipliée par la couleur du polygone.
Mon programme ne passe pas l'édition de liens ("undefined reference to ..."), que faire ?
Auteurs : Laurent Gomila ,
Comme toute bibliothèque, OpenGL nécessite d'être liée à votre programme si vous souhaitez l'utiliser, sans quoi
l'éditeur de lien ne trouvera pas les fonctions correspondantes et vous jettera à la figure des messages tels que ceux-ci :
Avec Visual C++ : il faut aller dans les propriétés du projet, "édition de liens", "entrée", et y ajouter les fichiers .lib
correspondant aux bibliothèques GL que vous utilisez (opengl32.lib pour OpenGL, glu32.lib pour GLU, et glut32.lib
pour GLUT). Vous pouvez également lier en ajoutant la directive #pragma comment(lib, "xxx.lib") dans l'un de vos
fichiers sources.
Avec MinGW : il faut également aller dans les propriétés du projet, "édition de liens", et ajouter les fichiers adéquats
(libopengl32.a pour OpenGL, libglu32.a pour GLU, et libglut32.a pour GLUT). Vous pouvez également ajouter
directement à la ligne de commande "-lxxx" pour lier avec la bibliothèque libxxx.a.
A noter que sous Windows vous aurez également besoin de lier avec GDI (libgdi32.a ou gdi32.lib), pour tout ce qui est
création du contexte d'affichage.
Avec gcc : de la même manière qu'avec MinGW, il faut ajouter dans la ligne de commande "-lgl", "-lglu" ou "-lglut"
pour utiliser ces bibliothèques.
Dernières remarques : vérifiez d'une part que tous ces fichiers sont dans des répertoires prédéfinis de l'éditeur de lien,
et d'autre part... assurez-vous que vous les avez bien installé !
- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > GLU
Qu'est-ce que GLU ?
Auteurs : shenron666 ,
GLU (pour OpenGL Utility Library) est une bibliothèque d'outils destinés à OpenGL, et basés sur la même conception
que cette dernière.
Elle possède de nombreuses fonctions destinées entre autres à créer des mip-mapsà partir d'une seule image, de générer
des coordonnées de texture, de dessiner des surfaces quadriques et des NURBS, de faire appel à un tesselator, et bien
d'autres encore.
La version 1.2 de GLU était destinée à OpenGL 1.1, la version actuelle de la bibliothèque GLU est la 1.3 qui apporte de
nouvelles fonctionnalités correspondant aux capacités d'OpenGL version 1.2.
- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Sommaire > GLUT
Qu'est-ce que GLUT ?
Auteurs : shenron666 ,
GLUT (GL Utility Toolkit) est une bibliothèque portable apportant principalement la gestion du fenêtrage à OpenGL.
La version originale de GLUT a été créée par Mark Kilgard puis portée sous Win32 (Windows 95, 98, Me, NT, 2000,
XP) par Nate Robins.
De nombreux tutoriaux et exemples trouvables sur internet utilisent GLUT, c'est la bibliothèque la plus répandue.
Malheureusement aujourd'hui, GLUT n'est plus mis à jour et la dernière version (3.7.6) date du 8 novembre 2001. (voir
aussi Quelle bibliothèque de fenêtrage utiliser ?).
Où trouver GLUT ?
Auteurs : Laurent Gomila ,
Vous trouverez également tout ce qu'il faut concernant le portage Windows de GLUT, sur le site de Nate Robins.
Enfin, FreeGlut, une version open source de GLUT possédant une licence beaucoup moins restrictive est disponible
sur le site de FreeGlut.
Il est très simple de s'en passer : il faut créer un projet "Application Windows" et non "Application Console". Attention
toutefois à bien changer le point d'entrée : il s'agira de WinMain et non plus de main.
Si vous souhaitez tout de même conserver main comme point d'entrée (pour des raisons de portabilité par
exemple), certains EDI permettent de modifier celui-ci. Par exemple sous Visual Studio, il faut ajouter l'option "/
ENTRY:mainCRTStartup" dans la ligne de commande de l'éditeur de liens.
- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Il n'y a aucun moyen de forcer GLUT à ajouter des coordonnées de texture, ainsi il vaudra mieux passer par les fonctions
de GLU pour générer ces formes (gluCylinder, gluSphere, ...). Leur génération est toutefois plus compliquée, puisqu'il
faut passer par les quadriques. Plus d'informations sur l'utilisation des quadriques ici :
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=18.
Pour activer la génération de coordonnées de texture, il suffit d'intercaler un petit appel à gluQuadricTexture avec
GL_TRUE en paramètre.
return EXIT_SUCCESS;
}
- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glRasterPos2f(x, y);
while(*s)
{
glutBitmapCharacter(font, *s);
s++;
}
}
Les deux glDisable permettent d'être sûr d'avoir le texte affiché dans la couleur souhaitée.
Pour savoir quoi passer pour le paramètre font, voir Comment connaître les fonts que l'on peut utiliser avec
glutBitmapCharacter ?.
Comment connaître les fonts que l'on peut utiliser avec glutBitmapCharacter ?
Auteurs : fearyourself ,
Il faut regarder dans vos fichiers d'inclusion GLUT des lignes suivantes :
En principe ceux-là ne bougeront pas donc vous pouvez vous en servir. Mais il y en aura peut-être d'autres...
Le paramètre font est le même que celui passé à glutBitmapCharacter (voir Comment connaître les fonts que l'on peut
utiliser avec glutBitmapCharacter ?).
- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
Avant de lancer la boucle avec glutMainLoop(), on définira donc les fonctions qui vont gérer le clavier, la souris,
l'affichage, etc.
Lorsqu'une touche est appuyée, elle peut être une touche dite normale ou spéciale. Par exemple, les touches F1 - F12
sont considérées spéciales ; les lettres de l'alphabet sont elles des touches normales.
Voici les deux fonctions qui permettent de gérer l'appui d'une touche sur un clavier :
Ensuite, on peut gérer le fait qu'un utilisateur relâche une touche en utilisant les fonctions suivantes :
Exemple :
int main()
{
/* Initialisation de la fenêtre ... */
- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
glutKeyboardFunc(&AppuiTouche);
glutSpecialUpFunc(&RelachementTouche);
return EXIT_SUCCESS;
}
La fonction glutMouseFunc permet de savoir si un bouton de la souris a été appuyé. Le premier paramétre est lequel
des boutons a été appuyé, voici les possibilités :
#define GLUT_LEFT_BUTTON 0
#define GLUT_MIDDLE_BUTTON 1
#define GLUT_RIGHT_BUTTON 2
Ensuite l'état est le fait d'appuyer un bouton ou le relâcher. En effet, cette fonction est appelée deux fois pour un clic
souris (une fois pour l'appui du bouton et une fois pour le relâchement).
#define GLUT_DOWN 0
#define GLUT_UP 1
La fonction glutMotionFunc génère des événements lorsque la souris bouge et qu'un bouton est appuyé. Elle donnera
la nouvelle position de la souris mais, pour connaître quel bouton est appuyé, il faudra utiliser en même temps une
fonction callback définie par glutMouseFunc.
Enfin, la fonction glutPassiveMotionFunc permet de générer des évènements lorsque la souris bouge et lorsqu'aucun
bouton n'est appuyé. De nouveau, c'est la nouvelle position qui sera passée à la fonction callback.
int main()
{
/* Initialisation de la fenêtre ... */
- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
/* Enregistrement de notre fonction de gestion des mouvements souris */
glutPassiveMotionFunc(&MouvementSouris);
return EXIT_SUCCESS;
}
Exemple :
void Affichage()
{
/* Affichage de la scène */
}
int main()
{
/* Initialisation de la fenêtre ... */
return EXIT_SUCCESS;
}
- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
#define GLUT_LEFT 0
#define GLUT_ENTERED 1
Exemple :
int main()
{
/* Initialisation de la fenêtre ... */
return EXIT_SUCCESS;
}
- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/
#define GLUT_FULLY_COVERED 3
Exemple :
case 1 :
/* Le délai du second timer est écoulé */
break;
}
}
int main()
{
/* Initialisation de la fenêtre ... */
return EXIT_SUCCESS;
}
- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 - 2006 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://jeux.developpez.com/faq/opengl/