除非设置 MESA_GL_VERSION_OVERRIDE=3.0,否则顶点着色器中的编译失败

Compilation failure in vertex shader unless MESA_GL_VERSION_OVERRIDE=3.0 is set

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

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

没有那个环境变量我得到这个错误:

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

问题:

顶点和片段代码如下:

==> 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);
}

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

changes the value returned by glGetString(GL_VERSION) and possibly the GL API type.
...
Mesa may not really implement all the features of the given version. (for developers only)

这意味着,但是 forcing 一个 OpenGL 版本报告了我的 Mesa 你很幸运,特定的 DEMO 是 运行ning / 运行ning 很好,因为 Mesa 没有实现所需版本的某些功能,可能会崩溃或出现异常。

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

所以回到问题。

Shouldn't the GL version be detected somehow?

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

What is the proper way set this up to build this as a cross-platform OpenGL application to run on many different Linux distro's?

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

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

我对 CentOS 7 知之甚少,但它看起来很旧(2014 年发布)- 我想所引用的示例 运行 在大多数现代 Linux 发行版上都很好修改(使用更新的 Mesa 和更新的 GTK)。