【问题标题】:Compilation failure in vertex shader unless MESA_GL_VERSION_OVERRIDE=3.0 is set除非设置了 MESA_GL_VERSION_OVERRIDE=3.0,否则顶点着色器中的编译失败
【发布时间】:2026-01-14 04:20:04
【问题描述】:

我正在尝试运行这个 GL 演示,但如果我设置 MESA_GL_VERSION_OVERRIDE=3.0,它只能在 CentOS 7 中运行,如下所示:

git clone https://github.com/ebassi/glarea-example.git
make
MESA_GL_VERSION_OVERRIDE=3.0 ./glarea

如果没有该环境变量,我会收到此错误:

我尝试将 #version 更改为 110 和 120,但编译失败。

问题:

  • 不应该以某种方式检测 GL 版本吗?
  • 将其构建为跨平台 OpenGL 应用程序以在许多不同的 Linux 发行版上运行的正确方法是什么?

顶点和片段代码如下:

==> glarea-fragment.glsl <==
#version 130

smooth in vec4 vertexColor;

out vec4 outputColor;

void main() {
  outputColor = vertexColor;
}

==> glarea-vertex.glsl <==
#version 130

in vec3 position;
in vec3 color;

uniform mat4 mvp;

smooth out vec4 vertexColor;

void main() {
  gl_Position = mvp * vec4(position, 1.0);
  vertexColor = vec4(color, 1.0);
}

【问题讨论】:

  • 您可以尝试将着色器的版本设置为“#version 300 es”,看看是否可行? GLSL ES 3.0 有点类似于桌面 GLSL >= 130,因此它可能在不修改着色器代码的情况下工作。

标签: c linux opengl glsl mesa


【解决方案1】:

我认为你错过了描述 MESA_GL_VERSION_OVERRIDE 实际作用的部分:

更改 glGetString(GL_VERSION) 返回的值,可能还有 GL API 类型。
...
Mesa 可能没有真正实现给定版本的所有功能。 (仅限开发者)

这意味着,但是强制一个 OpenGL 版本报告了我的 Mesa,你很幸运特定的 DEMO 正在运行/运行良好,因为 Mesa 没有实现所需版本的某些功能并且可能会崩溃或行为不端。

  • Mesa 为不同级别的不同设备实现了一系列 OpenGL 驱动程序。因此 OpenGL 报告的版本没有覆盖取决于图形设备。
  • 此外,Mesa 在实现特定显卡特定版本的 OpenGL 方面取得了不同的进展。因此升级 Mesa 可能会带来更新的 OpenGL 版本(虽然升级 Mesa 通常需要升级 Linux;但如果您在真实硬件上运行 - 您可以尝试使用专有图形驱动程序)。
  • 此外,Mesa 实现了不同级别的 OpenGL CompatibleCore Profiles。现代应用程序在请求 Core Profile 时可能会使用更高版本的 OpenGL。您可以通过运行glxinfo 来检查差异,该glxinfo 报告有关您系统上的核心和兼容配置文件的信息。

所以回到问题。

不应该以某种方式检测GL版本吗?

是的,通常应用程序应该检查glGetString(GL_VERSION) 并在版本低于支持时以有意义的消息终止(而不是像本示例那样尝试编译不受支持版本的 GLSL 程序)。

将其构建为跨平台 OpenGL 应用程序以在许多不同的 Linux 发行版上运行的正确方法是什么?

这不是关于构建应用程序的问题,而是关于它的开发的问题。为了更加兼容,应用程序应该支持它可以运行的较低版本的 OpenGL。在这种特殊情况下,我猜想使代码与 OpenGL 2.1 兼容是一件小事。

但同时,较新的GTK versions 默认创建一个核心配置文件而不是兼容配置文件,因此可移植应用程序应该能够同时处理两者(通过提供不同的 GLSL 程序/处理缺少的 GL 功能等)。

我对 CentOS 7 知之甚少,但它看起来很旧(于 2014 年发布)——我猜所提到的示例无需修改即可在大多数现代 Linux 发行版上运行良好(使用更新的 Mesa 和更新的 GTK)。

【讨论】:

  • CentOS 7 有 Gtk 3.22,其中包括回退到兼容模式。所以应该可以修改代码以在旧系统上工作。但就像您指出的那样,较新的发行版可能会有较新的 Mesa,它会提供更高的 GL 版本支持。