我的笔记本电脑中装有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();
答案 0 :(得分:2)
设置代码不正确。您必须在创建上下文之前选择核心配置文件上下文,在上下文存在之后更改配置文件为时已晚,并且将无法使用。另外,根据SDL2文档,必须在通过SDL_GL_SetAttribute
创建窗口之前对SDL_CreateWindow
进行所有调用。
将所有呼叫移至SDL_GL_SetAtrribute
,使它们移至SDL_CreateWindow
之前。
此错误代码似乎可以在其他计算机上运行的原因是,根据您要求的兼容性还是代码配置文件上下文,不同的驱动程序提供了不同版本的OpenGL。
Mesa仅提供3.0用于兼容性上下文,
macOS将仅提供2.1用于兼容性上下文,
NVidia和AMD驱动程序将提供它们支持的最新版本。