22

我刚刚将我的 MacBook Pro 升级到 Mavericks (MacOS 10.9),包括 Xcode。根据 Apple 的“OpenGL Capabilities Table”,此版本支持 OpenGL 4.1,但调用 glGetString(GL_VERSION) 返回“1.2”,我的 GLSL 3.30 着色器(以“#version 330”开头)拒绝加载,表示该版本不支持。

我需要对 Mavericks 做些什么来启用 4.1 支持吗?

4

6 回答 6

23

当您在 OS X 上使用较低级别的 API 之一请求您的像素格式时,您需要将以下内容添加到您的属性列表中以使用核心配置文件:

CGL:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

现在,虽然特定常量被命名为...3_2Core,但它的实际含义是请求一个删除所有已弃用功能并至少支持 OpenGL 3.2 的上下文(换句话说,一个核心配置文件)。您可以使用相同的常量获得 4.1 或 3.3 的上下文;老实说,在常量中包含实际版本号可能是一个糟糕的选择。

如果您在请求像素格式时没有指定此项,OS X 将分别给您kCGLOGLPVersion_LegacyNSOpenGLProfileVersionLegacy。这将限制您使用 OpenGL 2.1 功能。

如果您使用的是更高级别的框架,则需要查阅您的 API 参考。但是,请注意,在 OS X 上,您必须具有核心配置文件上下文才能访问比 OpenGL 2.1 更新的任何内容。

于 2013-11-08T21:32:07.423 回答
13

使用 OpenGL 库 GLFW 最新版本是 3.0.4... 在你初始化 glfw init 之后

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);

在你把它变成你的curent窗口之后,剩下要做的就是创建你的主循环。

while (!glfwWindowShouldClose(_Window))
{
    ........
    glfwSwapBuffers(_Window);
    glfwPollEvents();
}

确保包含 glfwPollEvents(); 在循环中,这使得使用关闭按钮退出窗口成为可能。如果您在 xcode 中编译库时遇到问题,请在此处给我发消息,我会向您发送该库的副本。

于 2014-02-28T23:57:12.687 回答
2

为此苦苦挣扎了半天,终于用显卡支持的任何glsl版本都成功了。

有几个要点:

  1. 使用核心配置文件
  2. 将 MAJOR.MINOR 设置为您要使用的 GL 版本
  3. 如果不是使用最新版本的 GL,则必须启用 FORWARD COMPATIBILITY。

例如,正如@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);
于 2014-03-05T02:50:09.560 回答
1

http://support.apple.com/kb/HT5942

该站点的标题是“Mac 计算机:OS X Mavericks 中的 OpenCL 和 OpenGL 支持 - 了解您的计算机在 OS X Mavericks 中支持的 OpenGL 和 OpenCL 版本”。

于 2013-12-07T01:11:17.767 回答
1

如果您使用的是 LWJGL(从 2.90 版开始),则ContextAttribs 的 javadoc 标头中有一个轻微的问题:

... MacOS X 不支持此扩展。但是,为了在 MacOS X 10.7 或更高版本上启用 GL 3.2 上下文,必须将此类的实例传递给 LWJGL。唯一有效的配置是 ContextAttribs(3, 2, CONTEXT_CORE_PROFILE_BIT_ARB),其他任何内容都将被忽略。

于 2015-03-06T01:25:13.087 回答
0

如果您使用 SDL 作为您的高级 API,那么您需要做很多事情来获得 4.1 支持。

首先确保你有 SDL2 2.0.1(或者更高版本我猜)。例如使用 brew:

冲泡更新冲泡升级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);

于 2014-01-07T21:03:01.057 回答