6

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

4

1 回答 1

3

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

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

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

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

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

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

编辑

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

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

不仅必须定义所有 gl-whatever ,而且对于 OGL>1.1,还必须从驱动程序加载gl-functions。SDL 加载它使用的 gl 函数,当然大部分是 GL1.1 和一堆 GL2.1。
我发现这个 SDL+OGL3 示例似乎与没有外部加载程序(如 glew)一起工作,只有 SDL。我还没有测试过,但是我在 SDL 源代码中找不到加载了本示例中使用的一些 OGL 函数的位置。

我在SDL_opengl_gext.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. 使用两者都没有任何好处,并且您可能会遇到一些错误。

于 2020-06-10T16:15:13.527 回答