【问题标题】:OpenGL 3.x on Macbook Air mid 20122012 年中期 Macbook Air 上的 OpenGL 3.x
【发布时间】:2014-08-29 08:59:53
【问题描述】:

我正在尝试从我的 uni 讲师工作制作的模板中获取 OpenGL/glew 程序。他已将此代码添加到他的程序中:

if(!GLEW_VERSION_3_1) {
    std::cerr << "Driver does not support OpenGL 3.1" << std::endl;  
    return 1;
}

这会在我的 Mac 上打印错误。经过一番试验,我发现我的 mac 实际上运行的是 OpenGL(2.1 INTEL-8.28.30)。在这部分代码之前,我已经使用讨厌的 #ifndef APPLE 解决了这个问题,但从长远来看,我无法做到这一点。

有什么方法可以升级到 3.1 吗?

【问题讨论】:

    标签: c++ macos opengl glew


    【解决方案1】:

    该问题与 OpenGL 中的核心和兼容性上下文的概念以及 Apple 的实现有关。您需要确保应用程序请求核心配置文件 OpenGL 上下文。

    Apple 支持兼容性 OpenGL 上下文(支持所有已弃用的旧功能),直到最高 OpenGL 2.1(加上几个扩展)。 Apple 支持核心 OpenGL 上下文(删除了已弃用的旧功能),直到 OSX Mavericks 的最大 OpenGL 4.1(取决于硬件支持,旧硬件上为 3.3)。如果你下载一个名为 OpenGL Extension Viewer 的程序,你可以看到你有什么可用的。

    当您的程序创建 OpenGL 上下文时,默认情况下它会获得兼容性(以避免破坏旧程序)。您需要特别标记您想要一个核心配置文件。执行此操作的方法取决于您使用的窗口库。如果您碰巧使用的是 SDL2,那么在创建上下文时只需设置一个额外的标志。如果直接使用 Apple GL,您需要查看他们的文档。

    见:http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts

    注意:我注意到您正在使用 GLEW。我过去遇到过 GLEW 和核心上下文的问题。这是因为它使用已弃用的方法请求扩展字符串(因此在核心上下文中失败)。它看起来好像不支持任何扩展。如果发生这种情况,请参阅 GLEW 网站,您可以将一个实验选项传递给它的 init 以使其工作。

    【讨论】:

    • 非常感谢,这正是我所需要的。问题恰好是我的程序包含 OpenGL/gl3.h,而 GLEW 和 freeglut 都包含 OpenGL/gl.h。通过包含两者,我得到了“两全其美”——访问 gl3 函数和 2.1 中已弃用的东西。虽然我现在包含了 gl3,但由于 glew 没有注意到核心 gl3,OP 中的代码仍然无法工作。不过这并不重要,因为 gl3 的东西实际上是可用的。我通过#ifndef __APPLE__ #endif 解决了这个问题。再次感谢!
    • @HenrikHillestadLøvold:不,您可以在 OSX 的单一上下文中混合弃用的函数和现代 OpenGL 3.x 函数,并且包含的​​头文件在一切为了这个。目前尚不清楚您在这里究竟在做什么,您拥有哪些上下文版本,以及实际调用了哪些函数。
    • 不要在 Mac OS 上使用 GLEW。它没有任何用处。在 Mac OS 上,您只需包含要使用的 OpenGL 版本的标头,并链接到框架。正如@derhass 所说,您应该只包括gl.hgl3.h。请参阅此答案以获得(丑陋的)解决方案,以避免在使用 GLUT 时将两者都包含在内:stackoverflow.com/questions/23987479/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2023-02-18
    • 2021-08-12
    • 2019-12-25
    相关资源
    最近更新 更多