zyn*_*dor 7 opengl shader sdl dev-c++
我正准备在Windows下用Dev-C++重建我的库; 但是,我在此期间添加的着色器功能不受支持,编译器找不到相关的函数(:: glCreateShader(),:: glCreateProgram()等)
在互联网和Dev-C++文件夹中挖掘,我发现OpenGL实现(gl.h)只是v1.1.我找到了从SGI下载最新标题的建议.我找到了gl3.h,然而,经过仔细审查后,我意识到gl.h不包含在我的项目中,我应该看看SDL/SDL_opengl.h.
编辑: SDL_opengl.h 确实包含gl.h 并声明了相关函数的原型.所以问题是,为什么我给出了编译时错误而不是链接器错误?
(我的库只链接到mingw32,libOpenGL32,libSDL,libSDL_Image和libSDL_Mixer,就像在OSX下一样(当然除了mingw32)我没有任何问题.)
如何在Dev-C++和SDL中使用OpenGL v2.0着色器?
gl.h仅适用于OpenGL 1.1(在某些情况下,最高可达1.3,具体取决于您使用的文件版本和操作系统).对于其他一切你还需要glext.h和glxext.h(Linux/Unix)或wglext.h(Windows).
必须在运行时链接较新版本的OpenGL中的所有函数.因此,为了使用它们,您必须获得正确的函数地址并将其分配给函数指针.最简单的方法是使用像GLEW这样的东西.
手动方式是这样的:
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");
Run Code Online (Sandbox Code Playgroud)
或者用于Linux:
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");
Run Code Online (Sandbox Code Playgroud)
如果在包含glext.h之前定义GL_GLEXT_PROTOTYPES,则可以省略第一行.
编辑: SDL_opengl.h看起来像包含glext.h的副本(虽然不是最新的).因此,如果你使用它,上面应该仍然有效.如果要使用单独的glext.h,则必须在包含SDL_opengl.h之前定义NO_SDL_GLEXT.此外,只要未定义GL_GLEXT_PROTOTYPES或您自己编写函数原型,函数原型就不可用.
EDIT2:显然SDL有自己的GetProcAddress函数,名为SDL_GL_GetProcAddress.