Arch Linux上的OpenGL 3.3

时间:2016-10-17 14:55:40

标签: c linux opengl glfw mesa

我需要帮助使用核心配置文件进行一些OpenGL 3.3编程。我在安装了xf86-video-intelmesa-libgl软件包的Arch Linux操作系统上运行。我的CPU内置了Intel HD 4400

当我将glxinfo | grep OpenGL输入终端时,它显示我可以支持OpenGL 3.3

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 12.0.3
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 12.0.3
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 12.0.3
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:

我使用GLFW3和GLEW来设置OpenGL

if(!glfwInit()) {
    return -1;
}
GLFWwindow* window = glfwCreateWindow(800, 600, "Hello Guys", NULL, NULL);
if(!window) {
    glfwTerminate();
    return -1;
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

glfwMakeContextCurrent(window);

if(glewInit() != GLEW_OK) {
    printf("GLEW did not initialize\n");
    glfwTerminate();
    return -1;
}

但是,当我尝试编译着色器时,出现错误GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES

似乎Mesa或GLFW3正在使我的PC使用前向兼容配置文件而不是核心配置文件。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

来自the docs(强调我的):

void glfwWindowHint( int hint, int value )        
     

此功能为 next 调用设置提示   glfwCreateWindow。 ...

所以:除非你想the defaults确保在 之前设置提示 ,否则你需要创建窗口:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

GLFWwindow* window = glfwCreateWindow(800, 600, "Hello Guys", NULL, NULL);
if(!window) {
    glfwTerminate();
    return -1;
}