我刚把我的MacBook Pro升级到Mavericks(MacOS 10.9),包括Xcode。 根据苹果公司的“OpenGL功能表”,此版本支持OpenGL 4.1,但对glGetString(GL_VERSION)的调用返回“1.2”,我的以“#version 330”开头的GLSL 3.30着色器拒绝加载,并说该版本不受支持。
我需要在Mavericks上做些什么才能启用4.1支持吗?
我刚把我的MacBook Pro升级到Mavericks(MacOS 10.9),包括Xcode。 根据苹果公司的“OpenGL功能表”,此版本支持OpenGL 4.1,但对glGetString(GL_VERSION)的调用返回“1.2”,我的以“#version 330”开头的GLSL 3.30着色器拒绝加载,并说该版本不受支持。
我需要在Mavericks上做些什么才能启用4.1支持吗?
当您在OS X上使用较低级别的API请求像素格式时,您需要将以下内容添加到属性列表中,以便使用核心配置文件:
kCGLPFAOpenGLProfile, kCGLOGLPVersion_3_2_Core
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core
现在,虽然这个特定的常量被命名为...3_2Core
,但它实际上表示请求一个上下文,将所有不推荐使用的功能都删除并支持至少OpenGL 3.2(换句话说是一个核心配置文件)。您可以使用相同的常量获取4.1或3.3上下文;老实说,在常量中包含实际版本号可能是一个糟糕的选择。
如果您在请求像素格式时没有指定此选项,OS X将分别为您提供kCGLOGLPVersion_Legacy
或NSOpenGLProfileVersionLegacy
。这将限制您的功能仅达到OpenGL 2.1。
如果您正在使用更高级的框架,则需要查阅API参考文档。但请注意,在OS X上,您必须拥有核心配置文件才能访问任何新于OpenGL 2.1的功能。
glGetString(GL_VERSION)
对我来说返回的是 4.1 ATI-1.38.3
,但它仍然拒绝编译 #version 130
的着色器。它似乎接受 #version 330
的着色器,尽管我还不知道如何将我的着色器代码更新到 330... 我猜我正在遇到一个完全不同的问题? - Andy使用OpenGL库GLFW,最新版本为3.0.4,在初始化GLFW之后立即进行初始化。
if (!glfwInit())
{
printf("glfwInit() fail to initualize. \n");
glfwTerminate();
exit(-1);
}
在您初始化glfwInit()之后,请包含以下4行代码。这四行代码将使您能够使用您的操作系统支持的最高版本。在Mac上,它是OpenGL 4.1。
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
然后创建您的窗口。
_Window = glfwCreateWindow(width, height, title, 0, 0);
检查以确保它已被创建。
if (!_Window) {
printf("Display window fail to create. \n");
glfwTerminate();
exit(-1);
}
然后使用以下方法将其设置为当前窗口。
glfwMakeContextCurrent(_Window);
当你将它设为当前窗口后,剩下的就是创建你的主循环。
while (!glfwWindowShouldClose(_Window))
{
........
glfwSwapBuffers(_Window);
glfwPollEvents();
}
确保在循环中包含glfwPollEvents();,这可以使使用关闭按钮退出窗口成为可能。如果您在在Xcode编译库方面遇到问题,请在此处给我发送消息,我会向您发送库的副本。
我在这个问题上挣扎了很长时间,最终成功地使用了由显卡支持的任何glsl版本。
有几个关键点:
例如,如@kanthonye所指出的那样,如果您正在使用glfw,并使用gl版本3.2,则需要这些行:
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
<OpenGL/OpenGL.h>
和 <OpenGL/gl3.h>
,然后它就可以工作了。 - Bjorn......此扩展不支持MacOS X。但是,为了在MacOS X 10.7或更新版本上启用GL 3.2上下文,必须将此类的实例传递给LWJGL。唯一有效的配置是ContextAttribs(3、2、CONTEXT_CORE_PROFILE_BIT_ARB),其他任何内容都将被忽略。
如果您正在使用SDL作为高级API,则需要执行一些操作才能获得4.1支持。
首先,请确保您拥有SDL2 2.0.1(或更高版本)。例如,使用brew:
brew update brew upgrade sdl2
其次,您需要明确告诉SDL请求核心配置文件,如下所示
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );
第三,在Mac上请求核心配置文件的一个怪癖实际上需要您请求3.2才能获得4.1(!)。我认为这已经在SDL2存储库中修复,但尚未发布。
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);