【问题标题】:OpenGL 4.1(?) under MavericksMavericks 下的 OpenGL 4.1(?)
【发布时间】:2013-11-08 17:51:13
【问题描述】:

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

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

【问题讨论】:

  • 您是否在请求核心上下文?
  • 1.2?!你确定你说的不是 2.1?
  • 我在运行Richard Wright编写的OpenGL SuperBible第五版的示例代码时遇到了同样的问题,它使用glut来创建上下文,在网上搜索后,人们说glut没有在积极开发中,是GLUT引起的问题?
  • @wenboqiu:有 FreeGLUT,它得到了维护……在 OS X 上使用它的问题是它通过 X11。 X11 通过名为 XQuartz 的兼容性 X 服务器在 OS X 上提供,您无法使用 XQuartz 服务器获得 3.2+ OpenGL 上下文,因为它没有实现必要的 GLX 扩展来请求核心配置文件。这意味着任何在 OS X 上使用 3.2 的框架都必须通过原生 API,例如 CGL(全屏和 C)或 NSOpenGL(全屏/窗口化和目标 C)。 GLFW3 和许多其他框架这样做,FreeGLUT 仍然没有。
  • @AndonM.Coleman:感谢您的回答。

标签: macos opengl glsl osx-mavericks


【解决方案1】:

当您在 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 上,您必须具有 core 配置文件上下文才能访问比 OpenGL 2.1 更新的任何内容。

【讨论】:

  • “属性列表”? “核心配置文件上下文”?毫无疑问,与 XCode 有关。可悲的是,由于我的应用程序是跨平台的,因此我一直在避免使用 XCode。出于同样的原因,我一直在使用 GLUT 作为框架,但我怀疑如果我想使用比 OpenGL 2.1 更新的任何东西,我将不得不硬着头皮更多地参与 MacOS-具体发展。叹。无论如何,谢谢。
  • @user2507282:当我想到 Xcode 时,我想到了 Apple 希望你用来为 OS X / iOS 编写软件的 GUI 的怪物......这真的与 CGL 和NSOpenGL 是 OS X 中用于创建和管理渲染上下文的两个接口。无论如何,如果您想要现代 OpenGL,同时仍然隐藏低级操作系统特定的东西,请不要使用 GLUT;我建议你使用 glfw3 之类的东西,你必须有一个核心配置文件上下文才能在 OS X 上使用 GL 3.2+,而像 GLUT 这样的古老框架不会削减它。
  • glGetString(GL_VERSION) 为我返回 4.1 ATI-1.38.3 但它仍然拒绝编译 #version 130 着色器。它似乎接受#version 330 着色器,虽然我还不知道如何将我的着色器代码更新为 330...我猜我遇到了一个完全不同的问题?
  • 免责声明:我使用的是 JOGL,但这是其 glGetString 包装器的输出。
  • OS X 没有实现 GLSL 1.30。他们在旧版驱动程序中实现了 1.20,在核心中实现了 3.20。不过,您可以在旧版驱动程序中获得涉及 1.40 和 1.50 的各种扩展。
【解决方案2】:

使用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 中编译库时遇到问题,请在此处给我发消息,我会向您发送该库的副本。

【讨论】:

    【解决方案3】:

    为此苦苦挣扎了半天,终于用显卡支持的任何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);
    

    【讨论】:

    • 这对我也有用,但在我删除 glew 之后。 glew 和 glfw 应该是兼容的,但在 OS X 上 glew 只会引起问题。 OP 没有提到 glew,但这就像我试图弄清楚它的 2 天。我还必须导入<OpenGL/OpenGL.h><OpenGL/gl3.h>,然后它就起作用了。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      如果您使用的是 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),其他的都将被忽略。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-18
          • 1970-01-01
          相关资源
          最近更新 更多