【问题标题】:Do I have to include SDL_opengl.h after GL/glew.h?我必须在 GL/glew.h 之后包含 SDL_opengl.h 吗?
【发布时间】:2019-06-15 15:51:04
【问题描述】:

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

【问题讨论】:

  • 同时包含这两者将允许您在 OpenGL 应用程序中使用 SDL 的音频、事件处理、线程和时间(通常由 GLUT 执行的功能)。

标签: c opengl sdl-2 glew sdl-opengl


【解决方案1】:

SDL 可以被告知使用 OpenGL 进行渲染。但是您可以将SDL 用于其他事情并自己做OpenGL 的事情。

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

在第一种情况下,使用 SDL 渲染,SDL 将#include #include SDL_opengl.h 所需的所有 OGL 标头。例如,它包含在 SDL_render_gl.c

获取 OGL 函数指针两次,包括 glew.hSDL_opengl.h 不是要走的路。如果您在glew.h 之前包含SDL_opengl.h,您可能会遇到编译器断言失败。
如果您首先包含glew.h,也许编译器允许它,我还没有测试过它,SDL 标头中似乎没有任何东西可以检查这种情况。

但真正的问题是,使用 GLEWSDL (*) 将一无所获,这很容易失败。

(*) 确实,您可能需要一些“新”功能,这些功能包含在最新版本的 glew 中,但不包含在 SDL 中。在这种情况下,请避免使用 SDL 提供的所有 OGL 绘图功能。

编辑

@HolyBlackCat 关于 SDL 仅支持 GL 1.x 的评论并不完全正确。但这需要更多解释。

SDL 提供自己的 API。要绘制一条线,您调用SDL_RenderDrawLine,它在内部并根据使用的renderer 调用 gl-command 或另一个 API(OS、DirectX 等)的另一个命令。 gl-command 指的是 OpenGL 规范定义的命令(glDrawArrays、glBindVertexBuffer 等)。

所有 gl-whatever 不仅必须定义,而且对于 OGL>1.1,gl-functions 还必须从驱动程序加载。 SDL 加载它使用的 gl 函数,当然大部分是 GL1.1 和一堆 GL2.1。
我发现 this SDL+OGL3 example 似乎可以在没有外部加载程序(如 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。两者都使用没有任何好处,而且你可能会遇到一些错误。

【讨论】:

  • 据我所知,SDL_opengl.h 仅支持 GL 1.x。如果“您可能需要一些“新”功能,这些功能包含在最新版本的 glew 中,但不包含在 SDL 中” 仅当您认为 GL 2.x 是“新”时。 :P
猜你喜欢
  • 2022-01-20
  • 2014-03-13
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多