Pourquoi tous les appels de fonction OpenGL sont-ils précédés de «q» dans le code source de Doom 3?

42

Pourquoi chaque appel OpenGL est-il préfixé par un "q" dans le code source de Doom 3? S'agit-il de fonctions personnalisées ou d'une bibliothèque différente, et si oui, pourquoi utiliser cela sur OpenGL? N'importe quelle recherche Google propose le module Qt OpenGL, ce qui, je suppose, n'a rien à voir avec cela.

Ben
la source

Réponses:

62

Pour référence - la qgl.h de Doom3 .

OpenGL est une petite API étrange. Vous devez souvent utiliser des pointeurs de fonction, soit parce que de nouvelles fonctionnalités sont manquantes dans l’implémentation standard, soit parce que vous souhaitez utiliser des extensions. Par exemple, si vous souhaitez appeler glCreateShader, mais que le système d'exploitation sur lequel vous travaillez ne contient pas assez d'en-têtes GL nouveaux, vous devez l'utiliser glGetProcAddress("CreateShader")pour charger la fonction dans le pilote de l'utilisateur. Et puis vous devez stocker ce pointeur de fonction quelque part.

Même si votre environnement de développement a une fonction particulière, il est possible que les machines des utilisateurs ne le soient pas. Et puis, une fonction donnée peut prendre 2 à 3 formes (extension de fournisseur, extension ARB, fonction principale) et vous devrez peut-être alors rechercher une fonction sous plusieurs noms différents.

De nombreuses bibliothèques de GL "loader" (comme GLEW ) essaient de s'en tenir aux conventions de GL. Ils créent des "fausses" fonctions avec le glpréfixe habituel et essayent de faire en sorte que votre code fonctionne sur n'importe quel système d'exploitation ou pilote prenant en charge les fonctionnalités nécessaires. Pour l' essentiel, au lieu d' glFooêtre une fonction réelle, il est juste un pointeur global de la fonction et la bibliothèque du chargeur (pendant l' initialisation ou la première utilisation) les recherches FooEXT, FooARBet Foojusqu'à ce qu'il trouve une mise en œuvre et attribue ensuite que le pointeur global. Le code client ressemble à un appel de fonction classique, mais il est magiquement résolu lors de l’initialisation lors de l’initialisation d’une manière qui traite de toutes les plates-formes et de tous les pilotes.

D'autres bibliothèques placent les fonctions dans des espaces de noms ou s'écartent un peu de la norme GL. id écrit leur propre chargeur, soit parce qu'ils ne l' ont pas comme ceux qui existaient ou - plus probable - Quake antidate ne importe quelle autre bibliothèque id aurait pu utiliser (le qdans les qglstands probables pour Quake, ce qui était le premier jeu id Tech à l' utilisation GL).

La spécification GL est écrite avec cette possibilité. La spécification est écrite sans préfixes; c'est l'implémentation d'OpenGL qui décide du préfixe à utiliser (le préfixe glcommun, bien sûr). Les bibliothèques de chargeur qui placent les fonctions dans des espaces de noms ou utilisent leurs propres préfixes sont totalement valides.

Doom 3, basé sur le moteur Quake, est tout à fait typique et justifié d'utiliser une bibliothèque de chargeur pour traiter les bizarreries de GL sur plusieurs plates-formes et de choisir d'utiliser le qglpréfixe.

Sean Middleditch
la source
+1, et bravo pour avoir repéré que j'ai idmal écrit (vous avez parfaitement raison en ce qui concerne la capitalisation), bien que fr.wikipedia.org/wiki/Id_Tech soit toujours écrit avec de l'espace, dans toutes les sources que j'ai pu trouver.
vaxquis