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 上完全没有价值。图书馆应该做三件事:
加载函数指针。这在 OS X 上是不必要的,因为 OS X 允许您仅通过链接到 OpenGL 框架来访问这些功能,并且因为这些功能是弱链接的,您的应用程序仍然 运行 即使他们不可用。这种弱链接在 Linux 或 Windows 上不可用。
它检测是否存在 Open GL 扩展。然而,GLEW 在核心上下文中完全彻底地无法做到这一点,因为它调用 glGetString(GL_EXTENSIONS)
而不是 glGetStringi(GL_EXTENSIONS, n)
。哎呀! GLEW 在 所有 平台上错误地检测到扩展。
它检测是否存在 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 或更高版本。
我正在尝试 运行 一个需要 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 上完全没有价值。图书馆应该做三件事:
加载函数指针。这在 OS X 上是不必要的,因为 OS X 允许您仅通过链接到 OpenGL 框架来访问这些功能,并且因为这些功能是弱链接的,您的应用程序仍然 运行 即使他们不可用。这种弱链接在 Linux 或 Windows 上不可用。
它检测是否存在 Open GL 扩展。然而,GLEW 在核心上下文中完全彻底地无法做到这一点,因为它调用
glGetString(GL_EXTENSIONS)
而不是glGetStringi(GL_EXTENSIONS, n)
。哎呀! GLEW 在 所有 平台上错误地检测到扩展。它检测是否存在 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 toGL_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 或更高版本。