C++ OpenGL 着色版本错误 - 不支持 GLSL x [Ubuntu 16.04]

Posted

技术标签:

【中文标题】C++ OpenGL 着色版本错误 - 不支持 GLSL x [Ubuntu 16.04]【英文标题】:C++ OpenGL shading version error - GLSL x is not supported [Ubuntu 16.04] 【发布时间】:2016-11-13 10:42:17 【问题描述】:

我目前正在开发一个在 Ubuntu 16.04 上使用 OpenGL 的项目,但遇到了一个重大问题。在这一点上,我不知道该怎么做,因为感觉我已经尝试了一切来解决这个问题。

由于某种原因,我的着色器无法编译并返回以下错误:

Failed to compile vertex shader!
0:1(10): error: GLSL 4.50 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, 3.10 ES, and 3.20 ES`

我已经调整了着色器文件中的版本,但没有任何运气。 #version 450 core 等,但我一直得到相同的结果。

供参考,这里是sudo glxinfo | grep "OpenGL"的输出:

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.1.0-devel
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 13.1.0-devel
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 13.1.0-devel
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

glxinfo 的输出显示 OpenGL core 4.5 已安装,为什么不支持?

我还尝试找到项目中使用的 OpenGL 的当前版本:std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;,这会导致返回空白。

到目前为止,我已经在这个问题上花费了 10 个小时,因此感谢您提供任何帮助!

编辑: 有没有办法通过即完全删除 GLSL(这部分)来强制项目/Ubuntu 使用 OpenGL 而不是 GLSL?

OpenGL ES profile version string: OpenGL ES 3.2 Mesa 13.1.0-devel
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

【问题讨论】:

根据this 表看来我安装了两个不同版本的OpenGL? 【参考方案1】:

对于遇到同样问题的其他人来说,这是对我有用的解决方案:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

【讨论】:

很高兴您解决了您的问题,作为下次的建议:发布完整代码或添加更多细节(不知道您使用的是 glfw) 感谢您的反馈。我会确保这样做。【参考方案2】:

似乎您没有明确要求核心配置文件上下文。您的 glxinfo 输出显示,不支持 兼容性配置文件 上下文(在 OpenGL-3.0 之前没有“兼容性”配置文件,但这是一个有争议的问题):

这告诉您,在 核心配置文件 中支持最高 v4.5:

OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.1.0-devel
OpenGL core profile shading language version string: 4.50
OpenGL core profile profile mask: core profile

...这确实告诉您,未明确标记的最高版本 core 将是 OpenGL-3.0:

OpenGL version string: 3.0 Mesa 13.1.0-devel
OpenGL shading language version string: 1.30

因此,要么请求 core 配置文件,要么接受您坚持使用 GL-3.0 及以下版本。


只是为了比较,下面是它如何寻找即使在核心配置文件之外也支持 OpenGL-4.x 的 OpenGL 实现 (NVidia):

OpenGL core profile version string: 4.4.0 NVIDIA 367.27
OpenGL core profile shading language version string: 4.40 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 4.5.0 NVIDIA 367.27
OpenGL shading language version string: 4.50 NVIDIA

【讨论】:

感谢您的回复。我在我的着色器文件中定义了#version 450 core,如果这是你的意思,我仍然会得到相同的结果。 @NicolaiPrebensen:这不是我的意思:我的意思是,在创建 OpenGL 上下文时,您必须请求核心配置文件上下文。您没有告诉我们,您是如何创建 OpenGL 上下文(您使用哪些库/框架)的。是 GLUT、GLFW、SLMF、SDL、GTK、Qt 普通 Xlib/GLX?如果你告诉我们你是怎么做的,我们可以告诉你如何让它选择一个核心配置文件上下文。【参考方案3】:

如果您打算使用 4.5 功能,则需要一个核心配置文件,并且根据此输出行,您的系统支持该配置文件

OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.1.0-devel

另一条输出线

OpenGL version string: 3.0 Mesa 13.1.0-devel

并不意味着您有两个不同的 openGL 驱动程序,而是您可以负担得起没有核心配置文件的 OpenGL 3.0 顶部。

为了使用核心配置文件功能,请确保启用它并使用正确的预处理器指令编译着色器

// Example using glut for context initialization
glutInitContextVersion(4, 5);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInit(&argc, argv);

// Shaders
#version 450
...

【讨论】:

嗯。似乎我缺少一些库,因为我找不到这些函数。 @NicolaiPrebensen 创建和绑定上下文的代码是特定于平台的,看看this post @NicolaiPrebensen 我想你也可以尝试像 this example by datenwolf 那样使用裸 X11/Xlib 来执行此操作,尽管我自己从未尝试过 我试试这个。只需阅读一点关于如何使用这些库的知识。 非常感谢宏的帮助。这使我朝着正确的方向前进。我将在我的工作解决方案中添加一个新的回复!【参考方案4】:

在你的着色器中尝试下一个代码:

"#version 320 es

精度中等p浮点数;

...你的代码“

【讨论】:

如果您添加一些关于为什么这会有所帮助的解释,这个答案会更好。【参考方案5】:

GLSL 是 OpenGL 使用的着色器语言,尽管两个版本号并不总是匹配。根据您的意见,您似乎正在使用片上英特尔 GPU。该芯片的驱动程序通过 Mesa 运行,据我所知还不支持 OpenGL 4。

如果您有 Nvidia 卡,您可以安装支持最新版本 OpenGL 的专有 NVidia 驱动程序。否则,您将需要修改着色器以使用旧版本的语言。

【讨论】:

感谢您的回复。我没有 Nvidia 卡,因为这是我的笔记本电脑,集成了 Intel 显卡(i7 Core / Skylake)——据我所知,这也是 Intel 的最新版本。从外观上看,它似乎支持 OpenGL 4,因为它具有字符串 OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.1.0-devel,但我不确定是否诚实。

以上是关于C++ OpenGL 着色版本错误 - 不支持 GLSL x [Ubuntu 16.04]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL着色器版本编译错误

在 Mac 上使用 openGL,不支持版本 '150' 错误

如何将变量(不统一)浮点值从 C++ 传递到顶点着色器 OpenGL ES 2.0

无法获得简单的 2D 着色器以在 C++ openGL 中绘制红色三角形(无编译器错误)

带和不带着色器的 VBO OpenGL C++

Qt & OpenGL OS X:山狮上的 GLSL 着色器版本只有 120