SDL2没有设置OpenGL版本?

我想用C使用SDL2(2.0.4)来创建一个OpenGL 3.3(核心)上下文。 但它似乎默认为我的电脑支持的任何兼容性configuration文件。 与LWJGL2和Java一起工作良好。

这是我的C代码与SDL2。

#include <SDL2/SDL.h> #include <SDL2/SDL_events.h> #include <epoxy/gl.h> #include <epoxy/glx.h> void main(){ //set opengl attributes, supposed to happen before window creation SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); //OpenGL core profile SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 3); //OpenGL 3+ SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 3); //OpenGL 3.3 if (SDL_Init (SDL_INIT_EVENTS | SDL_INIT_VIDEO) < 0){ printf ("sdl init error: %s", SDL_GetError()); return; } SDL_Window* window = SDL_CreateWindow ( "SDL2 Problem", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP ); if (window == NULL){ printf ("could not create window: %s\n", SDL_GetError()); return; } //initialize OpenGL stuff SDL_GLContext openglContext = SDL_GL_CreateContext (window); printf ("glGetString (GL_VERSION) returns %s\n", glGetString (GL_VERSION)); SDL_GL_DeleteContext (openglContext); SDL_DestroyWindow (window); SDL_Quit(); } 

输出是

 glGetString (GL_VERSION) returns 3.0 Mesa 11.2.0 

那么为什么它不给我一个OpenGL 3.3核心configuration文件? 这是我的Java代码与LWJGL2(2.9.3)

 import org.lwjgl.LWJGLException; import org.lwjgl.opengl.ContextAttribs; import org.lwjgl.opengl.PixelFormat; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; public class withLWJGL2{ public static void main (String [] args){ try{ PixelFormat pixelFormat = new PixelFormat(); ContextAttribs contextAttribs = new ContextAttribs (3, 3);//opengl 3.3 Display.create (pixelFormat, contextAttribs); } catch (LWJGLException e){ e.printStackTrace(); System.exit(0); } // check version string System.out.println ("glGetString (GL_VERSION) returns " + GL11.glGetString (GL11.GL_VERSION)); Display.destroy(); } } 

输出是

 glGetString (GL_VERSION) returns 3.3 (Core Profile) Mesa 11.2.0 

工作得很好! 输出

 glxinfo | grep version 

 server glx version string: 1.4 client glx version string: 1.4 GLX version: 1.4 Max core profile version: 3.3 Max compat profile version: 3.0 Max GLES1 profile version: 1.1 Max GLES[23] profile version: 3.0 OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.0 OpenGL core profile shading language version string: 3.30 OpenGL version string: 3.0 Mesa 11.2.0 OpenGL shading language version string: 1.30 OpenGL ES profile version string: OpenGL ES 3.0 Mesa 11.2.0 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00 

我的电脑运行基于Ubuntu的GalliumOS 2.0。 只是为了确保它不是那台电脑的问题,我在另一台电脑上试了一下,运行Ubuntu 16.04并使用NVIDIA。 用SDL2输出C代码是

 glGetString (GL_VERSION) returns 4.5.0 NVIDIA 361.42 

因此,OpenGL 3.3的版本并不是OpenGL的版本。 在这台电脑上的LWJGL2的Java代码的输出是

 glGetString (GL_VERSION) returns 3.3.0 NVIDIA 361.42 

工作得很好! 输出

 glxinfo | grep version 

 server glx version string: 1.4 client glx version string: 1.4 GLX version: 1.4 OpenGL core profile version string: 4.5.0 NVIDIA 361.42 OpenGL core profile shading language version string: 4.50 NVIDIA OpenGL version string: 4.5.0 NVIDIA 361.42 OpenGL shading language version string: 4.50 NVIDIA OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 361.42 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20 GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix, 

所以在这两种情况下,LWJGL2都可以工作,但SDL2似乎默认为驱动程序支持的最高兼容性configuration文件。 如何使用SDL2获得3.3(核心)configuration文件?

SDL_GL_SetAttribute()之后放置SDL_GL_SetAttribute()调用。