我正试图在2012年中期运行OSX 10.10.1和NVIDIA GeForce GT 650M的Macbook Pro Retina上运行需要OpenGL 3.1的程序。我通过Homebrew安装了Glew,并且运行glewinfo
显示以下内容:
GL_VERSION_3_1: OK
---------------
glDrawArraysInstanced: OK
glDrawElementsInstanced: OK
glPrimitiveRestartIndex: OK
glTexBuffer: OK
但是,当代码I' m中的行glewIsSupported("GL_VERSION_3_1")
返回false时。我在网上搜索了一些关于OSX上X Server的东西,只支持OpenGL 2.1,并认为这可能是问题所在。
所以我也下载了GLView并注意到当我从Core切换到兼容性时,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
答案 0 :(得分:3)
这不仅仅发生在OS X上,因为GLEW对Open GL核心环境的支持不足。例如,这也发生在我的带有Mesa的Linux系统上:它报告版本3.0,即使实际支持3.3。
在OS X上,我建议如下:
您必须创建核心上下文才能获得2.1以外的OpenGL版本。如果您没有请求核心上下文,您将始终获得2.1。 (glewinfo
程序无法请求核心上下文,因此它始终在OS X上报告版本2.1。)
使用#include <OpenGL/gl3.h>
并直接调用这些函数。如果你的系统上没有它们,那么这个标题中的函数将为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上,它很有用,因为它会加载函数指针。
我想这意味着
glewIsSupported("GL_VERSION_3_1")
检查兼容性版本而不是核心。如果我将该检查更改为GL_VERSION_2_1
我的显卡或计算机是否存在任何风险?
GLEW对核心或兼容性一无所知。它只是询问您提供的上下文的版本。它报告版本2.1的原因是因为它是您正在使用的上下文的实际,真实版本。 Open X的实际版本在OS X上有所不同,具体取决于您使用核心还是兼容性上下文。
(请注意,在某些平台和驱动程序上,根据您要求的版本,您也会获得不同的版本,但这不适用于OS X.)
有没有办法知道代码是否需要核心或兼容性?
遗憾的是,这是一项烦人而乏味的工作。没有简单的方法可以确定您的代码所需的Open GL版本。您可以下载相关的Open GL规范并阅读您的代码,但这里有一些开始:
查看GLSL版本。每个GLSL版本对应于Open GL的版本。例如,1.20 = OpenGL 2.1。请注意,核心上下文不需要支持GLSL版本 lower 而不是1.40。
如果您的代码使用VAO(顶点数组对象),则假定OpenGL 3.x或更高版本。