我正准备在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");

或Linux:

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

如果在包含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

其他提示

您可以在运行时加载函数的地址吗?

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

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
scroll top