将 OpenGL 从 3.0 更新到 3.1

将 OpenGL 从 3.0 更新到 3.1

我需要将 OpenGL 版本从 3.0 升级到 3.1。 Stackexchange 上充满了解决特定情况的帖子,事实证明我很难从树林中看到树木,更不用说估计树木的老化了,可以这么说。

因此,我根据我的情况收集了以下信息,只是为了提出另一个针对具体情况的问题。问题是

  1. 是否可以升级
  2. 为此必须/可以采取哪些步骤(请尽可能具体)

情况如下:

  • 操作系统:Ubuntu 14.04 LTS
  • 内核,来自uname -vr:4.4.0-96-generic #119~14.04.1-Ubuntu SMP 2017 年 9 月 13 日星期三 08:40:48 UTC 2017
  • 设备,来自lshw -c video: VGA 兼容控制器 GT218 [GeForce 210] NVIDIA --- 这确实支持 OpenGL 3.1供应商的规格
  • 司机来自lshw -c video: nouveau
  • 新风信息来自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:

可根据要求提供更多信息。例如,synaptic 列出了 28 个已安装的软件包来响应搜索词“mesa”,但我无法说出哪一个是相关的。

答案1

总结评论:应用大概行为不端。

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 也支持更高版本。这可以让你的程序满意,而不必欺骗它。

答案2

如果您的应用程序需要兼容性配置文件的支持,那么您对 ​​Mesa 的运气就不太好:它仅支持 Core 配置文件,而这正是它向您显示 OpenGL 3.3 支持的地方。

如果您需要该应用程序运行,您可能需要尝试安装官方专有的 nvidia 驱动程序而不是 nouveau。它完全支持核心和兼容性配置文件,以及许多 nvidia 特定的扩展。

如果您选择安装官方驱动程序,您将需要 340 系列驱动程序,在nvidia-340Ubuntu 上打包(这是 nvidia.com 建议的 GeForce 210 版本)。

相关内容