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

问题描述 投票:1回答:1

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

c opengl sdl-2 glew sdl-opengl
1个回答
0
投票

SDL可以被告知使用OpenGL渲染。但是您可以将SDL用于其他用途,也可以自己做OpenGL的工作。

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

[在第一种情况下,使用SDL呈现,SDL将#include #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-what-whatever不仅必须是defined,而且对于OGL> 1.1,还必须从驱动程序loaded中使gl函数。 SDL加载了它使用的gl函数,这是GL1.1的大部分,以及一堆GL2.1的。 我发现this SDL+OGL3 example似乎没有外部加载程序(如glew),只有SDL。我尚未对其进行测试,但是在SDL源代码中找不到该示例中使用的某些OGL函数已加载。

我在SDL_opengl_glext.h中看到的内容(包括在SDL_opengl.h中)是Khronos提供的标头的几乎副本,它们对最新版本(4.4?)的原型进行了[[define原型。这些头文件也是glew文件的一部分;尽快更新它们。

然后我们提出了这个问题。 a)我将仅使用SDL API吗?如果是,则不需要GLEW。 b)我将自己使用OGL 1.x,还是使用SDL GL渲染?如果是,再次,不需要GLEW。 c)我想自己做一些OGL> = 2。如果使用SDL已加载的功能(祝您好运,请找出它们),则不需要GLEW。 d)我想充分利用OGL的全部功能。然后不要在执行GL渲染的窗口中使用SDL进行渲染。

我是d),我包括哪些标题? 首先,请记住您需要一个“ gl-functions loader”。因为SDL不会加载所有OGL函数(而是一堆),所以您需要另一个加载器,例如GLEW。

然后如果要使用GLEW,则只需包含glew.h而不是SDL_opengl.h。同时使用两者没有好处,您可能会遇到一些错误。

© www.soinside.com 2019 - 2024. All rights reserved.