Ite*_*tor 5 c opengl glew sdl-opengl sdl-2
我想用 SDL2 创建一个 OpenGL 项目。我通常通过GL/glew.h首先包含来开始我的 OpenGL 项目。SDL_opengl.h之后我必须包括吗?它还包含 OpenGL API 标头,因此在我看来没有必要同时包含两者。
SDL可以被告知使用 OpenGL 进行渲染。但您可以将SDL其用于其他用途并自行执行 OpenGL 操作。
在第二种情况下,您需要一种方法来定义并从驱动程序加载 GL 的 API 函数指针。GLEW就是这样一个函数加载器。
在第一种情况下,使用 SDL 渲染,SDL将 #include #include SDL_opengl.h. 例如,它包含在 SDL_render_gl.c 中
两次获取 OGL 函数指针(包括两者glew.h)SDL_opengl.h并不是正确的方法。如果您SDL_opengl.h之前包含,glew.h则可能会出现编译器断言失败。
如果您首先包含glew.h编译器可能允许它,我还没有测试它,SDL 标头中似乎没有任何内容可以检查这种情况。
GLEW但真正的要点是,使用(*)不会得到任何结果SDL,这是要避免失败的。
(*) 确实,您可能需要一些包含在最新版本的 glew 中但不包含在 SDL 中的“新”功能。在这种情况下,请避免 SDL 提供的所有 OGL 绘图功能。
编辑
@HolyBlackCat 关于 SDL 仅支持 GL 1.x 的评论并不完全正确。但这需要更多解释。
SDL 提供自己的 API。要绘制一条线,您可以调用SDL_RenderDrawLine,它在内部根据所使用的渲染器调用 gl 命令或另一个 API(操作系统、DirectX 等)的另一个命令。我的gl-command意思是 OpenGL 规范定义的命令(glDrawArrays、glBindVertexBuffer 等)。
不仅必须定义所有 gl-whatever,而且对于 OGL>1.1,还必须从驱动程序加载gl-functions 。SDL 加载它使用的 gl 函数,不可否认的是大部分 GL1.1 和一堆 GL2.1。
我发现这个 SDL+OGL3 示例似乎可以在没有外部加载器(如glew)的情况下工作,只有SDL。我没有测试过它,但我在 SDL 源代码中找不到加载本示例中使用的一些 OGL 函数的位置。
我在SDL_opengl_glext.h(包含在 参考资料SDL_opengl.h)中看到的是 Khronos 提供的标头的几乎副本,它确实定义了最新版本(4.4?)的原型。这些标头也是glew文件的一部分;glew 会尽快更新它们。
然后我们就提出了这个问题:
我在情况 4 中,我应该包含哪些标头?
首先,请记住您需要一个“gl-functions loader”。因为 SDL 不会加载所有 OGL 函数(而只是一堆),所以您需要另一个加载器,例如 GLEW。
然后,如果您无论如何都要使用 GLEW,只需包含而glew.h不是SDL_opengl.h. 使用两者没有任何好处,并且您可能会遇到一些错误。