我正在尝试使用 OpenGL 开发 C/C++ 应用程序。不幸的是,我无法访问 OpenGL 3.0 之后的任何功能。我有 Mesa 版本 18.0.5、Linux Mint 18 64 位、4.18.1 内核和英特尔集成显卡。
终端输出:
~ $ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Broadwell-U
Integrated Graphics (rev 09)
~ $ glxinfo | grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 5500 (Broadwell
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.1 Mesa 18.0.5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES
3.10
OpenGL ES profile extensions:
我确信我的硬件最高支持 OpenGL 4.4,因为这台机器在 MS 推送/强制更新之前是 Windows 10 机器,并且在那段时间我使用 OpenGL 4.4 和 GLSL 440 进行开发。
此外,我可以通过 JOGL 在 Java 上运行 OpenGL 4.4 程序,JOGL 将所有必需的 OpenGL 库打包在一起,似乎根本不依赖系统版本。
那么基本上,为什么 Mesa 说核心版本是 4.5,然后给出了 3.0 的版本字符串呢?(相同版本的 glGetString(GL_VERSION) 返回。)我怎样才能重新获得对 OpenGL 4.4 的访问权限?(如果不是 4.5!)
据我了解,重要的值是“最大核心配置文件版本”,而不是“OpenGL 版本字符串”。如果您在创建上下文时未指定核心配置文件,或者您编写类似
Mesa 将为您提供 OpenGL 3.0 上下文(这是有道理的,因为配置文件是在 OpenGL 3.0 中引入的,所以这是应用程序可能不知道它们的最后一个版本)。如果你想要更新版本的 OpenGL,你需要指定相应的配置文件:
或者
连同使用的版本
glutInitContext()
。请注意,以这种方式施加 OpenGL 版本会产生强约束;我想你知道你在做什么;-)。一些开发人员尝试以合理的低版本为目标(例如 OpenGL 3.2),然后询问他们需要的任何扩展——这通常效果更好,因为流行的扩展往往会在相应的 OpenGL 版本完全支持之前可用一段时间。司机。
MESA_GL_VERSION_OVERRIDE
只是一个调试或 Mesa 开发工具;它强行覆盖报告的 OpenGL 版本,并且可以设置为 Mesa 实际上不支持的值!