我是否必须在 GL/glew.h 之后包含 SDL_opengl.h?

Ite*_*tor 5 c opengl glew sdl-opengl sdl-2

我想用 SDL2 创建一个 OpenGL 项目。我通常通过GL/glew.h首先包含来开始我的 OpenGL 项目。SDL_opengl.h之后我必须包括吗?它还包含 OpenGL API 标头,因此在我看来没有必要同时包含两者。

Rip*_*pi2 4

SDL可以被告知使用 OpenGL 进行渲染。但您可以将SDL其用于其他用途并自行执行 OpenGL 操作。

在第二种情况下,您需要一种方法来定义并从驱动程序加载 GL 的 API 函数指针。GLEW就是这样一个函数加载器。

在第一种情况下,使用 SDL 渲染,SDL将 #include #include SDL_opengl.h. 例如,它包含在 SDL_render_gl.c 中

两次获取 OGL 函数指针(包括两者glew.hSDL_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 会尽快更新它们。

然后我们就提出了这个问题:

  1. 我只能使用 SDL API 吗?如果是,则不需要 GLEW。
  2. 我是否要自己使用 OGL 1.x,同时还要使用 SDL GL 渲染?如果是,则不需要 GLEW。
  3. 我想自己做一些OGL>=2。如果您使用 SDL 已加载的函数(祝您好运找到它们),则不需要 GLEW。
  4. 我想充分利用完整的 OGL 功能。那么就不要在进行 GL 渲染的窗口中使用 SDL 进行渲染。但使用 SDL 创建窗口和上下文。

我在情况 4 中,我应该包含哪些标头?
首先,请记住您需要一个“gl-functions loader”。因为 SDL 不会加载所有 OGL 函数(而只是一堆),所以您需要另一个加载器,例如 GLEW。

然后,如果您无论如何都要使用 GLEW,只需包含而glew.h不是SDL_opengl.h. 使用两者没有任何好处,并且您可能会遇到一些错误。