Question

J'étais sur le point de reconstruire ma bibliothèque en Dev-C ++, sous Windows; cependant, la fonctionnalité de shader que j'ai ajoutée entre temps n'est pas supportée, le compilateur n'a pas trouvé les fonctions associées (:: glCreateShader (), :: glCreateProgram (), etc.)

En fouillant dans Internet et dans le dossier Dev-C ++, j'ai constaté que l'implémentation OpenGL (gl.h) n'est que v1.1. J'ai trouvé des recommandations pour télécharger les derniers en-têtes de SGI . J’ai trouvé gl3.h, mais après un examen plus approfondi, j’ai réalisé que gl.h n’était de toute façon pas inclus dans mon projet et que je devrais regarder SDL / SDL_opengl.h.

EDIT: SDL_opengl.h inclut inclut gl.h et déclare des prototypes des fonctions en question. La question est donc de savoir pourquoi on me donne des erreurs de compilation plutôt que des erreurs de l'éditeur de liens.

(Ma bibliothèque ne lie que contre mingw32, libOpenGL32, libSDL, libSDL_Image et libSDL_Mixer, un peu comme sous OSX (sauf pour mingw32, bien sûr) où je n'ai rencontré aucun problème.)

Comment utiliser les shaders OpenGL v2.0 avec Dev-C ++ et SDL?

Était-ce utile?

La solution

gl.h concerne uniquement OpenGL 1.1 (et dans certains cas jusqu’à 1.3 en fonction de la version du fichier que vous utilisez et du système d’exploitation utilisé). Pour tout le reste, vous devez également glext.h et probablement glxext.h (Linux / Unix) ou wglext.h (Windows).

Toutes les fonctions des versions plus récentes d'OpenGL doivent être liées au moment de l'exécution. Donc, pour les utiliser, vous devez obtenir la bonne adresse de fonction et l’affecter à un pointeur de fonction. Pour ce faire, le moyen le plus simple consiste à utiliser quelque chose comme GLEW .

La méthode manuelle ressemblerait à ceci:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");

ou pour Linux:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");

Si vous définissez GL_GLEXT_PROTOTYPES avant d'inclure glext.h, vous pouvez omettre la première ligne.

EDIT: SDL_opengl.h semble contenir une copie de glext.h (elle n’est toutefois pas à jour). Donc, si vous utilisez ce qui précède devrait toujours être valide. Si vous souhaitez utiliser un glext.h séparé, vous devez définir NO_SDL_GLEXT avant d'inclure SDL_opengl.h. De plus, les prototypes de fonctions ne sont pas disponibles tant que GL_GLEXT_PROTOTYPES n'est pas défini ou que vous les écrivez vous-même.

EDIT2: Apparemment, SDL dispose de sa propre fonction GetProcAddress appelée SDL_GL_GetProcAddress .

Autres conseils

Pouvez-vous charger les adresses des fonctions lors de l'exécution?

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType);
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top