我目前正在使用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"
的输出 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核心4.5,为什么不支持?
我也试图find项目中使用的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:
对于遇到同样问题的任何人,这是对我有用的解决方案:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
好像你没有明确要求核心配置文件的上下文。 您的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实现(NVidia),即使在核心配置文件之外也支持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
如果您打算使用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 ...
尝试着色器中的下一个代码:
“#version 320 es
精度中等浮点;
…你的代码“
GLSL是OpenGL使用的着色器语言,尽管两个版本号并不总是匹配。 从你的使用上来看,你看起来像是在使用片上Intel GPU。 这个芯片的驱动程序通过Mesa,据我所知不支持OpenGL 4。
如果你有一个Nvidia卡,你可以安装支持最新版本的OpenGL的专有NVidia驱动程序。 否则,您将需要修改着色器以使用旧版本的语言。