我想用SDL2创建一个OpenGL项目。我通常通过首先包含GL/glew.h
来启动OpenGL项目。之后是否必须包含SDL_opengl.h
?它还包含OpenGL API标头,因此在我看来没有必要同时包含这两个标头。
答案 0 :(得分:1)
SDL
使用OpenGL渲染。但是您可以将SDL
用于其他用途,并自行完成OpenGL的工作。
在第二种情况下,您需要一种从驱动程序定义和加载GL的API函数指针的方法。 GLEW
就是这样的函数加载器。
在第一种情况下,使用SDL呈现,SDL
将#包含#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-不仅要定义,而且对于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会尽快对其进行更新。
然后我们想到了这个问题:
我是第4种情况,我包括哪些标头?
首先,请记住您需要一个“ gl-functions loader”。由于SDL不会加载所有OGL函数(而是一堆),因此您需要另一个加载器,例如GLEW。
然后,如果您将要使用GLEW,则只需包含glew.h
而不是SDL_opengl.h
。两者都没有用,您可能会遇到一些错误。