將 OpenGL 從 3.0 更新到 3.1
我需要將我的 OpenGL 版本從 3.0 升級到 3.1。Stackexchange 上到處都是針對特定情況的文章,事實證明,我很難從木頭上看到樹,更不用說估計樹木的老化了,可以這麼說。
因此,我收集了以下關於我的情況的資訊,只是為了問另一個具體案例的問題。問題是
- 是否可以升級
- 為此必須/可以採取哪些步驟(請盡可能具體)
情況如下:
- 作業系統:Ubuntu 14.04 LTS
- 核心,來自
uname -vr
:4.4.0-96-generic #119~14.04.1-Ubuntu SMP Wed Sep 13 08:40:48 UTC 2017- 設備,來自
lshw -c video
:VGA兼容控制器GT218$$ GeForce 210 $$NVIDIA — 這確實支持供應商規範中的 OpenGL 3.1- 司機來自
lshw -c video
:新- 新人資訊來自
dpkg -l | grep nouveau
ii libdrm-nouveau2:amd64 2.4.67-1ubuntu0.14.04.2 amd64 [...] ii libdrm-nouveau2:i386 2.4.67-1ubuntu0.14.04.2 i386 [...] ii xserver-xorg-video-nouveau-lts-xenial 1:1.0.12-1build2~trusty1 amd64 [...]
- OpenGL 資訊來自
glxinfo | grep OpenGL
OpenGL vendor string: nouveau OpenGL renderer string: Gallium 0.4 on NVA8 OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.0 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.0 Mesa 11.2.0 OpenGL shading language version string: 1.30 OpenGL context flags: (none) OpenGL extensions:
可根據要求提供其他資訊。例如,突觸列出了 28 個已安裝的包來響應搜尋詞“mesa”,但我不能說哪個是相關的。
總結評論:應用程序可能行為不端。
OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.0
這意味著您安裝了 Mesa 11.2,並且支持的最高 OpenGL 版本為 3.3。
現在,為什麼應用程序另有說明?查詢 OpenGL 版本的最常用方法曾經是呼叫
glGetString(GL_VERSION)
,這就是應用程序使用的方法。證明它使用它?環境變數將
MESA_GL_VERSION_OVERRIDE
報告的版本更改為您設置的任何版本。並將其設置為3.1
使應用程序停止抱怨。現在,像所有 OpenGL 函式一樣,
glGetString
需要啟動 OpenGL 上下文。但是,自從OpenGL 3.2 發布以來,要創建 OpenGL 上下文,您必須事先說明您想要的版本。當程序使用舊版本(*)時,這允許更高版本啟用兼容性。有趣的事情就在這裡:報告的版本
glGetString
取決於創建上下文時選擇了哪個版本。這會導致實施不當和未明確選擇配置文件的舊應用程序相信他們要求的版本是支持的最高版本。如果應用程序沒有選擇版本,則會自動創建舊版本的兼容性上下文。我認為這是您在這一行看到的:OpenGL version string: 3.0 Mesa 11.2.0
如果這是實際問題,升級不會有任何改變。但你可以保持這個
MESA_GL_VERSION_OVERRIDE=3.1
把戲。它應該載入 3.1 配置文件並在等待修復時讓程序開心。(*) 關於個人資料。這是 OpenGL 3.2 的新功能,可以在執行時選擇 OpenGL 功能集,方法是讓程序請求 OpenGL 版本,OpenGL 實現將“降級”到該版本。這從 3.2 版開始有效,留下瞭如何處理所有舊東西的問題,特別是因為 OpenGL3 是 API 的重大改進(glBegin / glVector 和其他東西都不見了)。選擇將 API 拆分為兩個配置文件:核心和兼容性。兼容性上下文保留了舊的、過時的呼叫,而核心上下文刪除了它們。
不過,對兼容性上下文的支持是完全可選的,雖然大多數供應商提供了一個與拆分時間大致匹配的版本(從 3.0 到 3.2),但很少有人會費心製作新版本的兼容性上下文。這就是@Ruslan 在他的回答中的建議:Mesa 僅支持 OpengGL 3.0 的兼容性配置文件,但 nVidia 也支持更高版本。這可以讓你的程序快樂而不必撒謊。