SDL 可以被告知使用 OpenGL 进行渲染。但是您可以将SDL 用于其他事情并自己做OpenGL 的事情。
在第二种情况下,您需要一种方法来从驱动程序中定义和加载 GL 的 API 函数指针。 GLEW 就是这样一个函数加载器。
在第一种情况下,使用 SDL 渲染,SDL 将#include #include SDL_opengl.h 所需的所有 OGL 标头。例如,它包含在 SDL_render_gl.c
获取 OGL 函数指针两次,包括 glew.h 和 SDL_opengl.h 不是要走的路。如果您在glew.h 之前包含SDL_opengl.h,您可能会遇到编译器断言失败。
如果您首先包含glew.h,也许编译器允许它,我还没有测试过它,SDL 标头中似乎没有任何东西可以检查这种情况。
但真正的问题是,使用 GLEW 和 SDL (*) 将一无所获,这很容易失败。
(*) 确实,您可能需要一些“新”功能,这些功能包含在最新版本的 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 会尽快更新它们。
然后我们提出这个问题:
- 我将只使用 SDL API 吗?如果是,则不需要 GLEW。
- 我是否要自己使用 OGL 1.x,但也要使用 SDL GL 渲染?如果是,同样,不需要 GLEW。
- 我想自己做一些 OGL>=2。如果您使用 SDL 已经加载的函数(祝您好运),则不需要 GLEW。
- 我想充分利用完整的 OGL 功能。然后不要在你做 GL 渲染的窗口中使用 SDL 进行渲染。但是使用 SDL 创建窗口和上下文。
我是第 4 种情况。我应该包含哪些标题?
首先,记住你需要一个“gl-functions loader”。因为 SDL 不会加载所有 OGL 函数(而只是一堆),所以您需要另一个加载器,例如 GLEW。
那么,如果您要使用 GLEW,只需包含 glew.h 而不是 SDL_opengl.h。两者都使用没有任何好处,而且你可能会遇到一些错误。