FAQ OpenGL Consultez toutes les FAQ

Nombre d'auteurs : 9, nombre de questions : 74, dernière mise à jour : 7 décembre 2019 

 
OuvrirSommaireLes extensions

OpenGL intègre un mécanisme d'extension. À travers les extensions, les constructeurs peuvent ajouter des fonctionnalités à OpenGL sans que celles-ci soient encore intégrées dans la spécification. Ainsi, dès le moment où une carte graphique possède une nouvelle fonctionnalité, celle-ci peut être utilisée à travers l'extension appropriée fournie par le constructeur.

Par la suite, lors de la conception de la spécification pour la prochaine version d'OpenGL, les membres du consortium Khronos décideront si oui ou non l'extension et les fonctionnalités apportées par celle-ci seront intégrées dans le cœur d'OpenGL (et donc, devront être disponibles sur tout matériel compatible avec cette version d'OpenGL).

Actuellement, il y a plus de 300 extensions disponibles. La documentation de celles-ci est disponible ici.

Créé le 8 avril 2016  par Laurent Gomila, LittleWhite

Il est possible de demander à OpenGL la liste de toutes les extensions supportées par le matériel, via la fonction glGetString appelée avec l'option GL_EXTENSIONS. La liste retournée est une chaîne de caractères, dans laquelle les extensions sont séparées par un espace.

Pour savoir quelle chaîne correspond à l'extension à tester, il suffit d'aller regarder une page Internet décrivant les spécifications de l'extension concernée ; cela se trouve très facilement.

Voici un exemple en C++, on vérifie si l'extension correspondant aux textures compressées est supportée :

 
Sélectionnez
// Récupération de la liste des extensions
std::string Extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));

// Recherche de l'extension qui nous intéresse : GL_ARB_texture_compression
if (Extensions.find("GL_ARB_texture_compression") != std::string::npos)
{
    // Extension trouvée : la fonctionnalité est supportée
}
else
{
    // Extension non trouvée : la fonctionnalité ne pourra pas être utilisée
}
Créé le 8 avril 2016  par Laurent Gomila

La majorité des extensions ajoutent de nouvelles fonctions à OpenGL. Pour pouvoir les utiliser, il faut d'abord récupérer leur adresse dans la mémoire. OpenGL fournit une fonction pour charger dynamiquement une fonction : wglGetProcAddress sous Windows, et glxGetProcAdress sous Unix. Celle-ci prend en paramètre le nom de la fonction sous forme de chaîne de caractères, et renvoie un pointeur sur la fonction.

Par exemple, pour charger la fonction glBindBufferARB qui sert à activer un VBO :

 
Sélectionnez
// Déclaration du pointeur sur la fonction qui nous intéresse
PFNGLBINDBUFFERARBPROC glBindBufferARB;

// Chargement de la fonction
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");

// Normalement, on a au préalable vérifié que l'extension correspondante était bien supportée,
// mais on vérifie tout de même qu'on a bien récupéré notre fonction
if (glBindBufferARB == NULL)
{
    // Erreur : fonction non chargée
}

// 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 dernière version de glext.h ?).

Pour faciliter le chargement des extensions et le rendre quasiment transparent, vous pouvez également utiliser GLEW, GLEE, glad, GLXW ou toute autre bibliothèque conçue dans ce but.

Créé le 8 avril 2016  par Laurent Gomila, LittleWhite

Le fichier glext.h contient toutes les informations nécessaires à l'exploitation des extensions OpenGL. Avoir la dernière version de ce fichier est donc impératif lorsque l'on souhaite utiliser les extensions OpenGL dans un programme.

Vous pouvez trouver la dernière version de glext.h sur le site d'OpenGL.

Sous Delphi, l'équivalent GLext.pas pourra être trouvé par exemple dans cette archive. Son utilisation est très simple, puisqu'une seule fonction est nécessaire pour charger les fonctions associées à une extension.

 
Sélectionnez
function glext_LoadExtension(ext: String): Boolean;

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.

Créé le 8 avril 2016  par Laurent Gomila
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005-2012 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.