Compatibilité OpenGL, conventions de dénomination et ARB vs EXT

14

Je pensais avoir acquis une compréhension générale du fonctionnement des conventions de dénomination et des extensions OpenGL, jusqu'à ce que je tombe sur un cas qui m'a dérouté.


Voici ma compréhension jusqu'à présent:

Pas de suffixe - par exemple glGenBuffers(). Cette fonction fait partie du profil principal. La page wiki me dit que cela a été ajouté au profil principal à partir de la version 1.5.

ARB - par exemple glGenBuffersARB(). Cette fonction fait partie de l' GL_ARB_vertex_buffer_objectextension standardisée . La spécification de cette extension déclare clairement GenBuffersARB()dans la section "Nouvelles procédures et fonctions". La section "Dépendances" me dit que je peux potentiellement y accéder à partir d'un contexte 1.4+, si le matériel prend en charge l'extension.

EXT - Il s'agit d'extensions et de fonctions spécifiques au fournisseur que seuls certains fournisseurs peuvent prendre en charge. L'objet tampon Vertex ne semble pas avoir d'extension EXT dans le registre.


Voici où ma compréhension tombe en panne:

glGenFramebuffers, comme le montre le wiki , a été ajouté au noyau en 3.0.

Maintenant, je veux accéder aux fonctionnalités du tampon de trame à une version de profil de base inférieure à 3.0. Je veux donc l'utiliser comme extension. Le registre des spécifications m'indique qu'il existe deux extensions disponibles - ARB et EXT .

Question 1 - Si une extension ARB existe, pourquoi existe-t-il une extension EXT? Ne choisiriez-vous pas toujours celui standardisé plutôt que celui spécifique au fournisseur?

Un coup d'œil à la spécification ARB dans la section "Nouvelles procédures et fonctions" m'indique que l'extension définit la GenRenderbuffers()fonction. Pas de suffixe ARB cette fois. GLEW n'a pas du tout de prototype de fonction glGenRenderbuffersARB(). Bizarre.

La spécification EXT a cependant une GenRenderbuffersEXT()fonction dans la nouvelle section des fonctions, et GLEW aussi glGenRenderbuffersEXT().

Question 2 - Pourquoi aucun suffixe ARB s'il y a un suffixe EXT? Comment cela fonctionne-t-il pour ARB, étant donné que les noms de la fonction ARB et de la fonction principale sont les mêmes?

Question 3 - Je veux finalement des fonctionnalités Framebuffer à partir d'un profil 1.4. Quelle extension et quel ensemble de fonctions dois-je utiliser pour obtenir une couverture de compatibilité matérielle maximale?

ApoorvaJ
la source

Réponses:

9

question 1 - Habituellement, la version EXT vient d'abord comme une collaboration entre deux ou plusieurs fournisseurs. Les extensions ARB nécessitent plus de discussion entre les membres votants de Khronos et peuvent avoir des changements par rapport à la version EXT avant d'être approuvées. Voir l'extension GL_ARB_direct_state_access qui comporte de nombreuses modifications par rapport à GL_EXT_direct_state_access.

Question 2 - La section Problèmes de l'extension GL_ARB_framebuffer_object indique pourquoi les fonctions n'ont pas de suffixe ARB:

(8) Pourquoi les nouveaux jetons et points d'entrée de cette extension n'ont-ils pas de suffixes comme les autres extensions ARB?

   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.

Question 3 - Si vous souhaitez utiliser des objets framebuffer sur un contexte où la version GL est inférieure à 3.0, vous devez regarder la chaîne d'extension:

  1. Si GL_ARB_framebuffer_object est pris en charge, utilisez les fonctions non ARB.
  2. Si seul GL_EXT_framebuffer_object est pris en charge, utilisez les fonctions EXT.
  3. Si aucune extension n'est prise en charge, vous devez revenir au rendu hors écran au niveau du système d'exploitation, comme pbuffers.
Jason Allen
la source