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

时间:2019-06-15 15:51:04

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

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

1 个答案:

答案 0 :(得分:1)

可以告诉

SDL使用OpenGL渲染。但是您可以将SDL用于其他用途,并自行完成OpenGL的工作。

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

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

两次获取OGL函数指针,包括glew.hSDL_opengl.h都不是可行的方法。如果在SDL_opengl.h之前加入glew.h,则可能会导致编译器声明失败。
如果您首先包含glew.h,也许编译器允许它,我还没有对其进行测试,那么SDL标头中的任何内容似乎都无法检查这种情况。

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

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

编辑

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

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

所有gl-what-不仅要定义,而且对于OGL> 1.1,还必须从驱动程序加载。 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。两者都没有用,您可能会遇到一些错误。