2013-12-23 44 views
1

我在带有Intel HD 3000 GPU的HP笔记本电脑上运行Arch Linux与Mesa 10。 (还有一个ATI卡,但我在启动时将其关闭。)我试图运行带有核心配置文件的OpenGL代码。使用OpenGL核心配置文件与Mesa 10和GLFW3

-> % glxinfo | grep version 
OpenGL core profile version string: 3.1 (Core Profile) Mesa 10.0.1 
OpenGL core profile shading language version string: 1.40 
OpenGL version string: 3.0 Mesa 10.0.1 
OpenGL shading language version string: 1.3 

然而,当我编译GLFW程序,试图强行核心配置文件,并要求OpenGL的版本,像这样:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 

int main(void) 
{ 
    // Use OpenGL 3.1 core profile 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); 
    glfwWindowHint(GLFW_CONTEXT_REVISION, 0); 

    // Create opengl context 
    int window_width = 1024; 
    int window_height = 768; 
    GLFWwindow* window = initialize_glfw(window_width, window_height); 
    if (!window) 
    { 
     glfwTerminate(); 
     std::exit(EXIT_FAILURE); 
    } 

    // Display OpenGL version 
    int major, minor, rev, client, forward, profile; 
    glfwGetVersion(&major, &minor, &rev); 
    std::cout << "OpenGL - " << major << "." << minor << "." << rev << std::endl; 
} 
的OpenGL 3.1和GLSL 1.4应根据glxinfo支持

以及与GLSL的#Version 140编译着色器,这是打印输出:

-> % ./main 
OpenGL - 3.0.3 
Shader compilation failed with this message: 
0:1(10): error: GLSL 1.40 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES 

因此,它似乎像的OpenGL 3.1和GLSL 1.4应予支持,但他们没有在我的GLFW PROG使用内存。谁能告诉我什么可能是错的?

+0

那么支持的着色语言是1.3,核心配置文件是1.40。我不知道为什么会这样,因为应该支持3.30。我的系统上有同样的问题(Archlinux)。您应该可以在mesa-dev邮件列表中询问。 – XapaJIaMnu

+0

'GLFW_CONTEXT_REVISION'不是一个窗口提示。 – elmindreda

回答

0

重新阅读文档后,似乎出现了两个问题。正如elmindreda指出的那样,在使窗口提示设置窗口提示恢复为默认值之后调用init,因此必须首先调用init。

其次,我使用的是OpenGL 3.1和GLFW文档say“如果请求低于3.2的OpenGL版本,则必须使用GLFW_OPENGL_ANY_PROFILE。”我试图使用GLFW_OPENGL_CORE_PROFILE。

0

在调用其他功能之前,您需要initialize GLFW。在调用函数之前,还需要使OpenGL上下文保持最新状态。

+0

我在我的初始化函数中使上下文成为当前。我也尝试在窗口提示之上移动这个初始化函数(所以顺序是:init,make window,make context current,窗口提示),但是这没有效果。 – nslo

+0

你是对的,init必须先来。谢谢! – nslo