【问题标题】:Glew's glewIsSupported("GL_VERSION_3_1") returning false on MBP OSX 10.10.1 with NVIDIA GeForce GT 650MGlew 的 glewIsSupported("GL_VERSION_3_1") 在带有 NVIDIA GeForce GT 650M 的 MBP OSX 10.10.1 上返回 false
【发布时间】:2015-01-30 18:14:25
【问题描述】:

我正在尝试从 2012 年中期开始在我的 Macbook Pro Retina 上运行一个需要 OpenGL 3.1 的程序,运行 OSX 10.10.1 和 NVIDIA GeForce GT 650M。我通过 Homebrew 安装 Glew 并运行 glewinfo 显示以下内容:

GL_VERSION_3_1:                                              OK 
---------------
glDrawArraysInstanced:                                       OK
glDrawElementsInstanced:                                     OK
glPrimitiveRestartIndex:                                     OK
glTexBuffer:                                                 OK

但是,当我正在运行的代码中的 glewIsSupported("GL_VERSION_3_1") 行返回 false 时。我在网上搜索了一些关于 OSX 上的 X Server 仅支持 OpenGL 2.1 的内容,并认为这可能是问题所在。

所以我还下载了GLView,并注意到当我从 Core 切换到 Compatibility 时,OpenGL 版本从 4.1 下降到 2.1。我想这意味着glewIsSupported("GL_VERSION_3_1") 检查的是兼容性版本而不是核心。如果我将该检查更改为GL_VERSION_2_1,我的显卡或我的计算机是否有任何风险?有没有办法知道代码是否需要核心或兼容性?如果它确实需要 X Server,有没有办法让 X Server 使用 OpenGL 3.1?

[编辑:这些是标题。]

...
#include <GL/glew.h>

#ifdef __linux__
#include <pthread.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#endif

#ifdef __APPLE__
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

【问题讨论】:

  • 不清楚在这个例子中你是否使用了 X 服务器。 XQuartz 确实将您限制为 OpenGL 2.1,但如果您使用的是 GLFW 之类的东西,它实际上位于平台本机窗口系统之上(它使用 NSOpenGL 而不是 GLX)。
  • 你为什么在 Mac 上使用 GLEW?您不需要在 OSX 上加载扩展,这是在其他平台上使用 GLEW 的主要原因。
  • @AndonM.Coleman,我不知道代码是否需要 X Server。我希望有办法检查它是否需要它。
  • @RetoKoradi,当我运行 cmake 时,它说它需要它,我在标题中看到它,我已将其添加到我的问题中。

标签: macos opengl glew xserver


【解决方案1】:

这不仅仅发生在 OS X 上,这是因为 GLEW 对 Open GL 核心上下文的支持很差。例如,这也发生在我的带有 Mesa 的 Linux 系统上:它报告版本 3.0,尽管实际上支持 3.3。

在 OS X 上,我建议如下:

  • 您必须创建核心上下文才能获得 2.1 以外的 OpenGL 版本。如果您不请求核心上下文,您将始终获得 2.1。 (glewinfo 程序无法请求核心上下文,因此它总是在 OS X 上报告 2.1 版。)

  • 使用#include &lt;OpenGL/gl3.h&gt; 并直接调用函数。如果您的系统上不可用,则此标头中的函数将为 NULL……就像您使用 GLEW 一样。

  • 使用glGetIntegerv(GL_MINOR_VERSION)glGetIntegerv(GL_MAJOR_VERSION)glGetStringi(GL_EXTENSIONS)正常检查版本号和是否存在扩展。

GLEW 在 OS X 上完全没有价值。该库应该做三件事:

  1. 它加载函数指针。这在 OS X 上是不必要的,因为 OS X 允许您仅通过链接到 OpenGL 框架来访问这些功能,并且因为这些功能是弱链接的,即使它们不可用,您的应用程序仍然可以运行。这种弱链接在 Linux 或 Windows 上不可用。

  2. 它检测到 Open GL 扩展的存在。但是,GLEW 在核心上下文中完全无法做到这一点,因为它调用 glGetString(GL_EXTENSIONS) 而不是 glGetStringi(GL_EXTENSIONS, n)。哎呀! GLEW 在所有平台上错误地检测到扩展。

  3. 它检测 Open GL 版本的存在。您可以使用glGetIntegerv(GL_VERSION_MAJOR)glGetIntegerv(GL_VERSION_MINOR) 自己完成此操作。

这就是为什么我不推荐在 OS X 上使用 GLEW。至少在 Windows 和 Linux 上,它很有用,因为它会加载函数指针。

检查版本

我想这意味着glewIsSupported("GL_VERSION_3_1") 检查的是兼容性版本而不是核心。如果我将该检查更改为GL_VERSION_2_1,我的显卡或我的计算机是否有任何风险?

GLEW 对内核或兼容性一无所知。它只是询问你给它的上下文版本。它报告版本 2.1 的原因是因为那是您正在使用的上下文的实际、真实的版本。 Open GL 的实际版本在 OS X 上会有所不同,具体取决于您使用的是核心上下文还是兼容性上下文。

(请注意,在某些平台和驱动程序上,根据您要求的版本,您还会获得不同的版本,但这不适用于 OS X。)

此代码需要什么版本的 Open GL?

有没有办法知道代码是否需要核心或兼容性?

不幸的是,这是一项烦人且乏味的任务。没有简单的方法可以确定您的代码需要哪个版本的 Open GL。您可以下载相关的 Open GL 规范并阅读您的代码,但可以从这里开始:

  • 查看 GLSL 版本。每个 GLSL 版本对应一个 Open GL 版本。例如,1.20 = OpenGL 2.1。请注意,支持低于 1.40 的 GLSL 版本不需要核心上下文。

  • 如果您的代码使用 VAO(顶点数组对象),则假定 OpenGL 3.x 或更高版本。

【讨论】:

  • 感谢您的回答!这确实阐明了这些工具的工作原理。我现在正在检查代码并尝试看看是否可以让它与您的建议一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2021-11-30
  • 2020-04-12
  • 2017-10-28
  • 2014-07-25
相关资源
最近更新 更多