2013-03-28 4 views
0

J'essaie d'utiliser l'extension de coordonnées de brouillard avec OpenGL sous Windows. Voici les premières lignes de mon code:Extension de coordonnées OpenGL Fog dans Windows

#include <windows.h> 
#include <gl\glut.h> 
#include "GLEXT.h" 

#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450  
#define GL_FOG_COORDINATE_EXT  0x8451     

PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL; 

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT"); 

Si cela, le compilateur laisse entendre que glFogCoordfEXT ne peut pas être trouvé. Mais une fois que je mets

glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT"); 

avant que les réglages des paramètres de brouillard, la compilation passé et exécute le programme bien.

Je ne suis pas familier avec les appels de fonctions spécifiques à Windows bien que j'utilise beaucoup Windows. Quelqu'un pourrait-il me dire comment cela fonctionne?

Répondre

0

Sur Microsoft Windows, vous compilez avec une bibliothèque (la .lib) et exécutez avec une bibliothèque différente (vos .dll). Microsoft contrôle le contenu de la bibliothèque de compilation, mais les fournisseurs sont en mesure de remplacer celui de l'exécution. Dans le cas d'OpenGL, la bibliothèque de compilation est assez ancienne (ne supporte que les fonctions OpenGL 1.1 et quelques extensions), et comme cette bibliothèque fournit les fonctions exportées dont le compilateur a besoin pour la liaison, les nouvelles fonctions OpenGL n'y sont pas incluses. En tant que tel, l'utilisation de pointeurs de fonction était nécessaire, car ils peuvent être récupérés à l'exécution à partir d'un fichier .dll. La fonction wglGetProcAddress() effectue cette récupération de fonction et tous les types que vous voyez en majuscules (par exemple, PFNGLFOGCOORDFEXTPROC) sont typedefs pour la fonction que vous pouvez obtenir avec wglGetProcAddress(). Donc, pour utiliser votre fonction glFogCoordfEXT(), vous devez le récupérer dans le fichier .dll avant de l'appeler. En règle générale, vous devez rassembler toutes les fonctions dont vous avez besoin pour utiliser le code d'initialisation wglGetProcAddress() au début de votre programme (mais après avoir créé votre contexte OpenGL).

Un autre point: vous devez vérifier que la version appropriée d'OpenGL est disponible (en appelant glGetString(GL_VERSION), et que toutes les extensions que vous pourriez avoir besoin sont pris en charge (en appelant soit glGetString(GL_EXTENSIONS) et analyse de la chaîne, ou si vous utilisez un plus OpenGL récent, appel glGetStringi() pour obtenir des chaînes d'extension individuelles) wglGetProcAddress() retournera NULL si la fonction n'est pas disponible dans votre implémentation OpenGL.Il retournera un pointeur de fonction valide est disponible, mais cela ne signifie pas nécessairement la fonctionnalité dont vous avez besoin est présent (c'est pourquoi vous devriez vérifier la chaîne d'extension) Cette situation est rare, mais peut se produire en raison des interactions d'extension

+0

Ou vous pourriez simplement utiliser un [pro par bibliothèque de chargement OpenGL] (http://www.opengl.org/wiki/OpenGL_Loading_Library) et ne pas s'en soucier. –

+0

Ce qui est vraiment la réponse la plus simple. – radical7

Questions connexes