我想用SDL2创建一个OpenGL项目。我通常通过首先包含GL/glew.h
来启动OpenGL项目。此后是否需要包含SDL_opengl.h
?它也包含OpenGL API标头,因此在我看来没有必要同时包含两者。
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
都不可行。如果在SDL_opengl.h
之前包含glew.h
,则可能会导致编译器断言失败。 如果您首先包含glew.h
,也许编译器允许它,我还没有测试过,并且SDL标头中的内容似乎都没有检查这种情况。
但是真正的要点是,将GLEW
与SDL
(*)一起使用一无所获,这很容易失败。
(*)的确,您可能需要在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
文件的一部分;尽快更新它们。
我是d),我包括哪些标题? 首先,请记住您需要一个“ gl-functions loader”。因为SDL不会加载所有OGL函数(而是一堆),所以您需要另一个加载器,例如GLEW。
然后如果要使用GLEW,则只需包含glew.h
而不是SDL_opengl.h
。同时使用两者没有好处,您可能会遇到一些错误。