无法使用OpenGL核心配置文件和创建以及OpenGL 4.x上下文

时间:2018-07-24 09:39:15

标签: c++ opengl glsl opengl-4

我正在尝试使用可编程管道(特别是使用OpenGL 4.2+)开发简单的OpenGL应用程序,但是我的程序似乎被OpenGL 3.0和GLSL 1.30所卡住。

在我的Ubuntu 18.04计算机上glxinfo |grep "OpenGL"的输出如下:

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) 
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.5
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.0.5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 18.0.5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

我创建了一个简单的程序,我相信它应该初始化OpenGL 4.2上下文:

#include <iostream>
#include <string>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

using namespace std;


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(600, 600);
    glutCreateWindow("OpenGL Test");
    glutInitContextVersion (4, 2);
    glutInitContextProfile (GLUT_CORE_PROFILE);

    if(glewInit() == GLEW_OK)
    {
        cout << "GLEW initialization successful! " << endl;
        cout << "Using GLEW version " << glewGetString(GLEW_VERSION) << 
endl;
    }
    else
    {
        cerr << "Unable to initialize GLEW  ...exiting." << endl;
        exit(EXIT_FAILURE);
    }

    cout << glGetString(GL_VERSION) << endl;
    cout << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
}

但是,当我运行该程序时,会将以下输出打印到控制台,显示使用的OpenGL版本是3.0,使用的GLSL版本是1.3。

GLEW initialization successful! 
Using GLEW version 2.0.0
3.0 Mesa 18.0.5    # OpenGL version
1.30               # GLSL Version

我正在如下编译并运行程序:

g++ OpenGLTest.cpp -o OpenGLTest -lglut -lGLU -lGL -lGLEW
./OpenGLTest

我做错了什么,或者我还能尝试解决什么?

1 个答案:

答案 0 :(得分:3)

glutInitContextVersion并设置了用于下一个上下文创建的参数;已经创建的所有上下文都不会受到影响。这对许多库来说都是正确的,而不仅仅是freeglut(例如SDL的行为方式相同)。据我所知,没有在GLUT中创建上下文的专用功能-上下文是在窗口创建过程中创建的,因此您需要在调用glutCreateWindow之前设置参数。