使用Dev-C++和SDL编写OpenGL v2.0着色器?

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着色器?


你到底为什么要使用Dev-C++?给自己一个方便,使用一个在过去4年内得到更新的IDE。(即使在它被支持的时候也不会出现错误和缺乏功能) - jalf
你为什么选择 Dev-C++ 而不是 VC++2008 Express? - Andrew Garrison
这是一个很公正的观点,我不能说我没有预料到。Windows 不会成为我的主要平台,我讨厌处理清单和 6 种不同版本的 MSVC 运行时库。此外,我还要开发 GP2X,它的官方开发工具包是一个疯狂的 Dev-C++,所以我认为它很方便... 是的,它并不是。 - zyndor
2
IDE的选择是个人口味问题,但DevC++已经不再更新了。它的指定继承者是Code::Blocks(http://www.codeblocks.org/)。所以选择这个,或者尝试其他的(Eclipse,VC Express),找到你最喜欢的那一个,但你不应该再使用Dev C++了。 - Ksempac
1
谢谢你的建议,我以前用过VS,也许我会回去用它。我没听说过Eclipse,我一定会试试看,如果不行还可以退而求其次用Code::Blocks。 - zyndor
2个回答

8

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或自己编写函数原型时,才能使用函数原型。
编辑2:显然,SDL有自己的GetProcAddress函数,称为SDL_GL_GetProcAddress

此外,只有在定义了GL_GLEXT_PROTOTYPES或者自己编写函数原型时,才能使用函数原型。 - zyndor

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接