2016-11-13 232 views
5

我目前正在使用Ubuntu 16.04上的OpenGL开发一个项目,并且遇到了一个主要问题。在这一点上,我不知道该怎么做,因为它觉得我已经尝试了一切,以解决这个问题。C++ OpenGL着色版本错误 - 不支持GLSL x [Ubuntu 16.04]

出于某种原因,我只是着色器将无法编译,并返回以下错误:

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: 

显示核心的OpenGL 4.5安装从glxinfo的输出,所以这是为什么不支持?

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

我已经花了10个小时在这个单一的问题,直到现在,所以任何帮助表示赞赏!

编辑: 有没有办法强制项目/ Ubuntu使用OpenGL而不是GLSL,即完全删除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: 
+0

根据[这](https://en.wikipedia.org/wiki/OpenGL_Shading_Language#Versions)表似乎我有两个不同版本的OpenGL安装? –

回答

7

其他任何人遇到同样的问题,编译你的着色器,这是对工作的解决方案我:

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

很高兴你解决了你的问题,作为下次的建议:发布完整的代码或添加一些更多的细节(不知道你使用的是glfw) –

+1

感谢您的反馈。我一定要这样做。 –

-2

GLSL是使用OpenGL的,虽然两个版本号并不总是与着色器语言。从你的投入,看起来你正在使用片上英特尔GPU。这个芯片的驱动程序通过Mesa进行了调查,据我所知目前还不支持OpenGL 4。

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

+0

谢谢 我没有Nvidia卡,因为这是我的笔记本电脑集成英特尔图形(i7核心/ Skylake) - 这也是英特尔最新的版本,据我所知,从它的外观来看,它似乎它支持OpenGL 4,因为它具有字符串'OpenGL核心配置文件版本字符串:4.5(核心配置文件)Mesa 13.1.0-devel',但我不确定是否诚实 –

3

好像你没有明确要求核心配置文件上下文。你的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 

...这不告诉你,这不是明确标明核心最高版本将是OpenGL的3.0:

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

因此要么核心配置文件或接受你坚持GL-3.0及以下。


只是为了对比,这里是它的外观为OpenGL实现(英伟达),它支持OpenGL-4。X外连一个核心配置文件:

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 
+0

感谢您的回复。定义'#vers离子450核心'在我的着色器文件中,如果这是你的意思,我仍然会得到相同的结果。 –

+0

@NicolaiPrebensen:这不是我的意思:我的意思是,当创建OpenGL上下文时,你必须请求一个核心配置文件上下文。你没有告诉我们,你是如何创建OpenGL上下文的(你使用的库/框架)。是GLUT,GLFW,SLMF,SDL,GTK,Qt普通Xlib/GLX?如果您告诉我们您是如何做到的,我们可以告诉您如何使其选择核心配置文件上下文。 – datenwolf

0

如果您打算使用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 
... 
+0

嗯。似乎我错过了一些图书馆,因为我无法找到这些功能。 –

+0

@NicolaiPrebensen创建和绑定上下文的代码是特定于平台的,请看看[这篇文章](http://stackoverflow.com/a/879128/1938163) –

+0

@NicolaiPrebensen我想你也可以尝试这样做裸X11/Xlib在[这个例子由datenwolf](http://stackoverflow.com/a/17608618/1938163)虽然我从来没有尝试过它自己 –

-1

尝试下一编码在你的shader:

“的#Version 320个ES

precision mediump float;

...您的代码“

+2

如果您添加了一些关于为什么会有所帮助的解释,此答案会更好。 – DaveyDaveDave