2016-11-13 96 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