Glew 的 glewIsSupported("GL_VERSION_3_1") 在 MBP OSX 10.10.1 和 NVIDIA GeForce GT 650M 上返回 false

Glew's glewIsSupported("GL_VERSION_3_1") returning false on MBP OSX 10.10.1 with NVIDIA GeForce GT 650M

我正在尝试 运行 一个需要 OpenGL 3.1 在我的 Macbook Pro Retina 上的程序,从 2012 年年中 运行宁 OSX 10.10.1 与 NVIDIA GeForce GT 650M。我通过 Homebrew 安装了 Glew,运行ning glewinfo 显示如下:

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

然而,当代码中的glewIsSupported("GL_VERSION_3_1")行运行宁returns错误。我在网上搜索并在 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?

[编辑:这些是 headers。]

...
#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

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

关于OSX,我推荐如下:

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

  • 使用#include <OpenGL/gl3.h>直接调用函数即可。 header 中的函数如果在您的系统上不可用,则将为 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 上,它很有用,因为它加载函数指针。

检查版本

I suppose this means that glewIsSupported("GL_VERSION_3_1") checks for the compatibility version and not the core. If I change that check to GL_VERSION_2_1 are there any risks for my graphics card or my computer in general?

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

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

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

Is there a way to know if the code requires core or compatibility?

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

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

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