2017-05-14 53 views
0

最近,我用OpenGL和LWJGL 2(Java)創建了自己的遊戲。之後,我想提高自己的編程技能,並開始學習如何在C++中使用OpenGL。OpenGL版本不等於支持的着色器版本

隨着LWJGL我可以使用#version 330但與C++和SDL2我只能用#version 110,但glGetString(GL_VERSION)回報3.0 Mesa 12.0.6

我初始化我的窗前,像這樣:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); 

SDL_Init(SDL_INIT_EVERYTHING); 

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 


m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); 
m_glContext = SDL_GL_CreateContext(m_window); 


GLenum status = glewInit(); 

if(status != GLEW_OK){ 
    std::cerr << "Glew failed!" << std::endl; 
} 

哪裏是我的問題?

+0

嘗試設置'SDL_GL_SetAttribute()'SDL_Init後'()的調用'... –

+0

什麼' glxinfo | grep「着色語言版本」'不得不說? – keltar

回答

0

您需要請求OpenGL核心配置文件。

默認情況下,您將獲得OpenGL兼容性配置文件。使用兼容性配置文件時,如果您在Mesa上運行,則將限制爲3.0版,如果您在macOS上運行,則限制爲2.1。使用核心配置文件,您將能夠訪問更新的版本。

如果您在Linux或Windows上使用AMD或nVidia的驅動程序,則這不是必需的。

在SDL,您可以通過加入這一行,你創建一個窗口前要求核心文件:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 
+0

部分工作。現在我可以將'SDL_GL_CONTEXT_MAJOR_VERSION'和'SDL_GL_CONTEXT_MINOR_VERSION'設置爲3.3而不會崩潰,但是當我在着色器中使用'#version 330'時,它仍會拋出錯誤,女巫說支持的GLSL版本是1.10,1.20,1.30,1.00 es,3.00 es –