Texel
OpenGL | Index | Contact





















Les extensions OpenGL


OpenGL a été créé en 1992. A cette époque, de nombreuses techniques avancées comme le multi-texturing ou les shaders n’étaient pas disponibles via cette API car elles n’avaient pas encore été inventées ou car le matériel était incapable de les gérer en temps réel.

Les librairies (.lib), les headers (.h) et le runtime d’OpenGL (.dll) disponibles sous Windows gèrent la version 1.1 d’OpenGL. Pour pouvoir utiliser des fonctionnalités plus récentes d’OpenGL (ex : 2.0), les programmeurs doivent y accéder par l’intermédiaire des drivers de la carte graphique. Chaque constructeur de cartes graphiques livre avec celles-ci un ensemble de drivers dont l’IDC (Installable Client Driver) qui ajoute des accès aux fonctionnalités des versions supérieures d’OpenGL. Ces accès, ce sont des pointeurs de fonctions qu’il faut récupérer.

Ceci explique pourquoi certaines applications OpenGL ne fonctionnent pas lorsque les drivers du constructeur (Nvidia ou ATI, mais pas ceux de Microsoft) ne sont pas installés, alors que les applications utilisant la dernière version de DirectX fonctionnent. Ceci explique aussi pourquoi une carte graphique peut soudainement avoir accès à des fonctions qui n’existaient pas lors de sa fabrication grâce à une simple mise à jour.

  Les extensions:
Toutes les nouvelles fonctions ajoutées à OpenGL depuis la version 1.1 sont associées à des extensions.
Une extension correspond à une fonctionnalité supplémentaire et possède un nom pour l'identifier ainsi qu'un ensemble de fonctions et/ou d'identifiants (utilisables comme paramètres à des fonctions parfois dèja présentes dans OpenGL 1.1).

Le nom commence par un préfixe qui permet de définir sur quel matériel elle est susceptible de fonctionner.

Si le préfixe d’une extension est ARB, cela signifie qu’elle est approuvée par le comité en charge de standardiser et gérer le développement d’OpenGL (l’Architecture Review Board). L’extension est alors présente dans les spécifications officielles d’une version donnée d’OpenGL. Pour pouvoir mettre la mention « supporte OpenGL 1.5 » sur leurs boîtes, les constructeurs de carte graphique doivent intégrer toutes les extensions ARB des spécifications 1.5 d’OpenGL.

Si le préfixe d’une extension est NV, cela signifie qu’elle a été inventée par Nvidia. Elle est donc utilisable sur au moins une carte graphique de la marque Nvidia.
Si l’extension est intéressante, ATI va aussi vouloir l’utiliser. Elle sera donc peut-être aussi utilisable sur certaines de leurs cartes (après autorisation je présume).
Si l’extension est très intéressante, elle va changer de préfixe qui deviendra EXT. Elle sera alors potentiellement candidate pour devenir une extension ARB faisant partie des spécifications de la prochaine version d’OpenGL (ou bien elle restera une extension supportée par de nombreuses cartes sans être officiellement reconnue comme un standard).

Les préfixes des fabricants les plus connus sont :
NV (Nvidia), ATI (ATI), SGI (Silicon Graphics), SUN (Sun Microsystems), …

Ces préfixes sont suivis d’un underscore puis d’une chaîne de caractère définissant le rôle principal de l’extension ou qui rappel simplement une technologie ou technique utilisée.

La liste des extensions disponibles et leurs spécifications sont consultables sur le site officiel d'OpenGL (www.opengl.org).

  Vérifier la présence d'une extension:
Avant d'appeler une extension, il faut vérifier qu'elle est supportée par la carte graphique de l'utilisateur pour pouvoir éventuellement utiliser une autre technique de rendu. La fonction ci-dessous commence par récupérer la liste de tous les noms des extensions disponibles sur la carte dans une chaîne de caractère. Ensuite, la fonction strstr permet de chercher si le nom d'une extension donnée est présente dans la liste.

// glExt_CheckGLExtension vérifie le support d'une extension par le système 
bool glExt_CheckGLExtension( char* extensionName ) 
{ 
  // On récupère la liste des extensions supportées 
  char* extensionList = (char*) glGetString(GL_EXTENSIONS); 
  if(strstr(extensionList, extensionName) == NULL) // Notre extension en fait-elle partie ?
    return false; 
  return true; 
} 


  Récupérer les identifiants:

Certaines extensions n'impliquent pas l'utilisation de nouvelles fonctions et se contentent d'ajouter des indentifiants à passer en argument à des fonctions existantes. C'est par exemple le cas pour le Cube Mapping. Pour utiliser ces identifiants il suffit de les déclarer avec un #define, après avoir récupérer leur valeur à partir des spécifications disponible sur OpenGL.org.

# define GL_TEXTURE_CUBE_MAP_ARB 0x8513


  Obtenir une fonction:
Pour utiliser une nouvelle fonction, on commence par déclarer le pointeur de fonction qui recevra la fonction. Ci-dessous, un exemple avec la fonction glActiveTextureARB qui permet d'activer une texture pour le multi-texturing. Cette fonction ne renvoie rien (void) et prend en paramètre un argument (target).

void (APIENTRY * glActiveTextureARB) (GLenum) = NULL;

Ensuite, on récupère l'adresse de la fonction avec la fonction wglGetProcAdress qui prend en argument le nom officiel de la fonction:

if( glExt_CheckGLExtension("GL_ARB_multitexture")==1 )
{
  glActiveTextureARB = (void (APIENTRY *) (GLenum) ) wglGetProcAddress("glActiveTextureARB");
}	
Il n'est pas toujours facile de connaître les prototypes des fonctions à utiliser, même avec les spécifications des extensions. On peut alors utiliser l'header glext.h disponible sur le site d'OpenGL, Nvidia et ATI.

  A noter:
On peut aussi utiliser des librairies qui permettent de faciliter le chargement des extensions.



  Références et liens:
  • Moving Beyong OpenGL 1.1 for Windows (www.gamedev.net)
  • Site officiel d'OpenGL (www.opengl.org)
  • Delphi3D (www.delphi3d.net) (disponibilité des extensions pour chaque driver de carte graphique)


  • Version originale: Janvier 2006
    Dernière mise à jour: Janvier 2006
    Par Grégory Smialek





















    www.texel.fr.fm