除非设置 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,但编译失败。
问题:
- 不应该以某种方式检测到 GL 版本吗?
- 在许多不同的 Linux 发行版上将其构建为 运行 的跨平台 OpenGL 应用程序的正确方法是什么?
顶点和片段代码如下:
==> 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)。
我正在尝试 运行 这个 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,但编译失败。
问题:
- 不应该以某种方式检测到 GL 版本吗?
- 在许多不同的 Linux 发行版上将其构建为 运行 的跨平台 OpenGL 应用程序的正确方法是什么?
顶点和片段代码如下:
==> 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)。