在Mavericks下的OpenGL 4.1(?)

时间:2013-11-08 17:51:14

标签: macos opengl glsl osx-mavericks

我刚刚将MacBook Pro升级为Mavericks(MacOS 10.9),包括Xcode。 根据Apple的“OpenGL功能表”,这个版本有支持 对于OpenGL 4.1,但是对glGetString(GL_VERSION)的调用返回“1.2”和我的GLSL 3.30着色器,以“#version 330”开头拒绝加载,这样说 版本不受支持。

我是否需要为Mavericks做点什么来启用4.1支持?

6 个答案:

答案 0 :(得分:21)

当您在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更新的任何内容。

答案 1 :(得分:12)

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

在你成为了一个完美的窗口之后,剩下要做的就是创造你的主循环。

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

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

答案 2 :(得分:2)

我在这方面挣扎了很长时间,终于成功使用了显卡支持的任何glsl版本。

有几个要点:

  1. 使用核心资料
  2. 将MAJOR.MINOR设置为您要使用的GL版本
  3. 如果没有使用最新版本的GL,则必须启用FORWARD COMPATIBILITY。
  4. 例如,正如@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);
    

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

如果你正在使用LWJGL(从版本2.90开始),the javadoc header of ContextAttribs中有一个温和的问题:

  

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

答案 5 :(得分:0)

如果您使用SDL作为高级API,则需要执行许多操作才能获得4.1支持。

首先确保你有SDL2 2.0.1(或者我以后猜)。例如使用brew:

  

brew更新   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);