Question

Je souhaite utiliser les fonctions exposées sous les extensions OpenGL.Je suis sous Windows, comment faire ?

Était-ce utile?

La solution

Solution facile:Utiliser GLUER.Regarde comment ici.

Solution difficile:Si tu as un raison très solide ne pas utiliser GLEW, voici comment obtenir la même chose sans lui :

Identifiez l'extension OpenGL et les API d'extension que vous souhaitez utiliser.Les extensions OpenGL sont répertoriées dans le Registre d'extensions OpenGL.

Exemple:Je souhaite utiliser les capacités du EXT_framebuffer_object extension.Les API que je souhaite utiliser à partir de cette extension sont :

glGenFramebuffersEXT()
glBindFramebufferEXT()
glFramebufferTexture2DEXT()
glCheckFramebufferStatusEXT()
glDeleteFramebuffersEXT()

Vérifiez si votre carte graphique prend en charge l'extension que vous souhaitez utiliser.Si c’est le cas, alors votre travail est presque terminé !Téléchargez et installez les derniers pilotes et SDK pour votre carte graphique.

Exemple:La carte graphique de mon PC est un NVIDIA 6600GT.Alors, je visite le Spécifications de l'extension NVIDIA OpenGL page Web et constatez que le EXT_framebuffer_object l'extension est prise en charge.Je télécharge ensuite la dernière SDK NVIDIA OpenGL et installez-le.

Le fabricant de votre carte graphique fournit un glext.h fichier d'en-tête (ou un fichier d'en-tête de nom similaire) avec toutes les déclarations nécessaires pour utiliser les extensions OpenGL prises en charge.(Notez que toutes les extensions peuvent ne pas être prises en charge.) Placez ce fichier d'en-tête à un endroit où votre compilateur peut le récupérer ou incluez son répertoire dans la liste des répertoires d'inclusion de votre compilateur.

Ajouter un #include <glext.h> ligne dans votre code pour inclure le fichier d’en-tête dans votre code.

Ouvrir glext.h, recherchez l'API que vous souhaitez utiliser et récupérez son correspondant moche déclaration.

Exemple:Je recherche les API framebuffer ci-dessus et trouve leurs déclarations laides correspondantes :

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *);

Tout cela signifie que votre fichier d'en-tête contient la déclaration API sous 2 formes.L’une est une déclaration de pointeur de fonction laide de type wgl.L’autre est une déclaration de fonction saine.

Pour chaque API d'extension que vous souhaitez utiliser, ajoutez vos déclarations de code du nom de la fonction en tant que type de chaîne laide.

Exemple:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;

Même si cela semble moche, tout ce que nous faisons est de déclarer des pointeurs de fonction du type correspondant à l'API de l'extension.

Initialisez ces pointeurs de fonction avec leurs fonctions légitimes.Ces fonctions sont exposées par la bibliothèque ou le pilote.Nous devons utiliser wglGetProcAddress() fonction pour ce faire.

Exemple:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT");

N'oubliez pas de vérifier les pointeurs de fonction pour NUL.Si par hasard wglGetProcAddress() n'a pas pu trouver la fonction d'extension, elle aurait initialisé le pointeur avec NULL.

Exemple:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT)
{
    // Extension functions not loaded!
    exit(1);
}

Ça y est, c'est fini !Vous pouvez désormais utiliser ces pointeurs de fonction comme si les appels de fonction existaient.

Exemple:

glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0);

Référence: Aller au-delà d'OpenGL 1.1 pour Windows par Dave Astle — L'article date un peu, mais contient toutes les informations dont vous avez besoin pour comprendre pourquoi cette situation pathétique existe sous Windows et comment la contourner.

Autres conseils

Une « très bonne raison » de ne pas utiliser GLEW pourrait être que la bibliothèque n'est pas prise en charge par votre compilateur/IDE.Par exemple:Générateur Borland C++.

Dans ce cas, vous souhaiterez peut-être reconstruire la bibliothèque à partir des sources.Si cela fonctionne, tant mieux, sinon le chargement manuel de l'extension n'est pas aussi mauvais qu'on le prétend.

@Kronikarz :À première vue, GLUER semble être la voie de l'avenir.NVIDIA le livre déjà avec son SDK OpenGL.Et sa dernière version date de 2007, alors que GLEE datait de 2006.

Mais l’utilisation des deux bibliothèques me semble presque la même.(GLEW a un initialisation() qui doit cependant être appelé avant toute autre chose.) Ainsi, vous n'avez pas besoin de changer à moins que vous ne trouviez qu'une extension n'est pas prise en charge sous GLEE.

GL3W est un script du domaine public qui crée une bibliothèque qui charge uniquement les fonctionnalités de base pour OpenGL 3/4.Il peut être trouvé sur github à l'adresse :

https://github.com/skaslev/gl3w

GL3W nécessite Python 2.6 pour générer les bibliothèques et les en-têtes pour OpenGL ;il ne nécessite plus Python après cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top