7

我正要在 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 着色器?

4

2 回答 2

8

gl.h 仅适用于 OpenGL 1.1(在某些情况下最高 1.3,具体取决于您使用的文件版本和操作系统)。对于其他所有内容,您还需要glext.h和可能的 glxext.h (Linux/Unix) 或wgext.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

于 2009-06-19T15:36:30.850 回答
0

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

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

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
于 2009-06-19T14:29:31.203 回答