不支持GLSL着色器4.30版

时间:2018-06-30 16:49:42

标签: opengl graphics versioning

我的笔记本电脑中装有Intel HD4400显卡。当我运行glxinfo | grep“ OpenGL”,我明白了

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.0-rc5
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.0-rc5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 18.0.0-rc5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
OpenGL ES profile extensions:

这应该意味着我的图形卡可以支持GLSL 4.30版,对吗?但是,我的着色器编译失败并显示以下消息

error: GLSL 4.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, and 3.10 ES

在我的代码中,我使用以下语句将上下文配置文件设置为核心

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)

之后,我将上下文主要版本和次要版本分别设置为4和3。

有什么想法吗?我在Ubuntu 18.04上。我以为可能是图形驱动程序不是最新的,但是如果它们不是最新的,那么glxinfo还会告诉我是否支持4.50版本吗?看来Ubuntu也已经安装了最新的Intel图形驱动程序,我不想冒险安装可能会损坏我的显示的图形驱动程序。

其他信息:

我在另一台计算机上运行了此确切的代码,并且运行良好(并且我很确定该计算机不支持GL 4.3兼容)。因此,我不认为这是我创建上下文的方式。这是我设置个人资料上下文版本的代码:

void set_gl_attribs()
{   
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE))
    {
        cout << "Could not set core profile" << endl;
    }
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4))
    {
        cout << "Could not set GL major version" << endl;
    }
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3))
    {
        cout << "Could not set GL minor version" << endl;
    }
}

这是其中我称之为代码的地方(在之前我称之为其他任何SDL或OpenGL函数):

SDL_Init(SDL_INIT_EVERYTHING);

window = SDL_CreateWindow("Sphere", 100, 100, width, height, SDL_WINDOW_OPENGL);
gl_context = SDL_GL_CreateContext(window);
//SDL_HideWindow(window);

set_gl_attribs();  // where I set the context, as shown above
SDL_GL_SetSwapInterval(1);

glewExperimental = GL_TRUE;
GLuint glew_return = glewInit();

1 个答案:

答案 0 :(得分:2)

设置代码不正确。您必须在创建上下文之前选择核心配置文件上下文,在上下文存在之后更改配置文件为时已晚,并且将无法使用。另外,根据SDL2文档,必须在通过SDL_GL_SetAttribute创建窗口之前对SDL_CreateWindow进行所有调用。

将所有呼叫移至SDL_GL_SetAtrribute,使它们移至SDL_CreateWindow之前。

此错误代码似乎可以在其他计算机上运行的原因是,根据您要求的兼容性还是代码配置文件上下文,不同的驱动程序提供了不同版本的OpenGL。

  • Mesa仅提供3.0用于兼容性上下文,

  • macOS将仅提供2.1用于兼容性上下文,

  • Windows上的
  • NVidia和AMD驱动程序将提供它们支持的最新版本。