在 OSX Big Sur 上使用 OpenGL 4.x 进行开发

Dev*_*yan 11 c++ opengl macos macos-big-sur

据 Apple 称,不再支持 OpenGL。但是,截至 2020 年 7 月 28 日,似乎许多设备都支持OpenGL v4.1。我有一个 2020 年的 Macbook Pro 16" 型号,它没有出现在上面提供的列表中。虽然我确定某种形式的兼容性存在于我的设备上,我不确定当现代版本被弃用时如何使用 OpenGL 进行开发。

我希望在运行 Big Sur 的 Macbook Pro 和我的 Windows 桌面之间进行开发。出于这个原因,我显然不希望关注特定于设备的库,例如 Direct3D 或 Metal。尽管 Apple 不直接提供支持,但是否可以使用较新版本的 OpenGL(例如 OpenGL 4.6)?我听说 AMD 显卡不能很好地与 OpenGL 配合使用,那么我还有什么选择呢?

gkv*_*311 16

macOS 上的内置 OpenGL 的工作方式与 Windows 或 Linux 等其他平台略有不同。在 Windows 上,系统提供的opengl32.dll实际上并不实现 OpenGL,而是从显卡供应商提供的驱动程序动态加载函数的代理库。显卡供应商提供独立于 Microsoft 的驱动程序,OpenGL 功能可以在没有 Microsoft 批准的情况下实施。

相比之下,macOS是一个更加封闭的系统,其中所有图形驱动程序都是系统的一部分,如果不更新系统本身,就无法(通常)更新。Apple 拥有对系统中 OpenGL 功能的完全控制权,并且没有向显卡供应商提供任何方式来向用户提供更多最新的 OpenGL 功能(即使他们的硬件在其他系统上支持这些功能)。

对于多平台软件的开发人员来说,这是非常不愉快的情况,因为 Apple 稳步推动他们的平台特定 API,如Metal作为唯一选择,这意味着更强大的供应商锁定和/或更昂贵的开发。

直接使用特定于平台的 API 的另一种方法是使用在特定于平台的 API 之上实现多平台 API 的代理库。到目前为止,目前已知的选项:

  • Apple 在 Metal 上的 OpenGL 实现。不幸的是,它一直停留在OpenGL 4.1 上,并且没有理由期望该版本会长大;该库甚至可以在一些较新的 macOS 中删除。您可能已经注意到,现代 macOS 版本的系统库提供的信息提到了 Metal,因此它已经是其他图形 API 的包装器(尽管 Apple 可能会通过访问某些内部结构来作弊)。
  • MoltenVK,一种基于Metal的开源Vulkan 1.1 实现。这不是一个 OpenGL 库,但 Vulkan 是另一个多平台图形 API,一些参考资料表明,当前状态下的 MoltenVK 足以在实际项目中使用,并且 Vulkan 1.1 预计将提供比过时的 OpenGL 4.1 更多的功能(尽管,我无法亲自证实这一点,只是我的期望)。
  • MoltenGL,一种基于Metal的闭源 OpenGL ES 2.0 实现。由于当前的实现仅限于 OpenGL ES 2.0(例如比 Apple 的内置 OpenGL / OpenGL ES 库低得多),它看起来非常无用......
  • Google ANGLE,一种基于其他 API的开源OpenGL ES实现。到目前为止,ANGLE 仅在 Metal 上实现了 OpenGL ES 2.0,在 Vulkan 上实现了 OpenGL ES 3.1(3.2 正在进行中)。因此,如果层不会炸毁,那么像 MoltenVK 这样的更多层理论上可以提供更多;)。然而,与 OpenGL 4.1 相比,即使是 OpenGL ES 3.2 看起来也不够好。还有MetalANGLE——一个 ANGLE 库分支,增加了 iOS 支持和一些额外的功能。
  • Zink,一种基于 Vulkan 的开源 OpenGL 实现。Zink 已经在 Linux 上实现了OpenGL 4.6(支持的 OpenGL 版本取决于公开的 Vulkan 功能和扩展)。有一项正在进行的工作使这个Mesa Gallium 驱动程序在 macOS 上的 MoltenVK 之上工作。

在我看来,如果您的应用程序可能会丢失一些需要更高版本 OpenGL 的功能,那么坚持使用OpenGL 4.1(由 Apple 提供)一段时间是一个不错的选择。尽管 Apple 已经弃用了 SDK 中的 OpenGL,但到目前为止,在较新的 macOS 更新中将在不久的将来实际将其删除似乎是不现实的;甚至Apple M1 GPU在 macOS Big Sur 上也获得了 OpenGL 4.1 支持。不知道苹果是否有一些策略黑名单​​应用程序使用来自AppStore 市场的不推荐使用的API(例如系统将支持OpenGL,但您将无法在AppStore 上发布应用程序),但这可能会在未来成为一个问题。替代OpenGL 4.6 实现(在 Metal 之上或在 Vulkan-on-top-of-Metal 之上)可能会在遥远的未来出现。

依靠Vulkan -on-top-of-Metal 实现可能是最临时的选择,但肯定需要更多的努力来开发基于 Vulkan 而不是 OpenGL 的图形引擎。但是,无法评论当前的 MoltenVK 实现如何与 Windows 上相同图形硬件的本机 Vulkan 实现相媲美(按功能/性能/限制)。当然,使用一些已经在多个图形 API(Vulkan/Metal/Direct3D/OpenGL/OpenGL ES)之上实现的现有图形引擎也会减轻您的维护负担,但这超出了初始问题的范围。

  • 过去曾尝试在 macOS 上进行一些图形开发。Apple 的 OpenGL 实现已经过时、存在缺陷且速度缓慢。目前*唯一*的选择是使用 Metal。如果您热衷于游戏开发,您可以使用可以针对 macOS 的游戏引擎。但是,请记住,Mac 不附带适当的显卡。因此,对于“酷”的东西来说,所有的 Mac 电脑都太慢了。我的观点:如果你热衷于图形开发转向 Windows/Linux,Apple 既不关心你也不想要你。 (2认同)
  • @adroste 非常同意 - 即使有一些相对较快的 GPU 配置,大多数 Apple 设备都具有相当慢且无能力的 Intel 或类似 Intel 的板载显卡。虽然不能说 OpenGL 实现比_我的经验_中的其他系统有更多错误 - 而是_(令人烦恼地)**更严格**_规范。但可能我的经验太有限/测试覆盖范围较小。 (2认同)
  • 这个答案相当全面。我在这个问题的辅助答案中添加了一些额外的想法(/sf/answers/4673322671/)。 (2认同)

Bil*_*ngs 16

@gkv311的回答相当全面。我将添加以下想法(全面披露,我是 MoltenVK 和 MoltenGL 项目的首席开发人员)

  • 恕我直言,Vulkan 生态系统是跨最大数量平台进行面向未来的游戏开发的最佳选择。这里是基于该方法的 API 分层选项的一个很好的总结,允许选择在 Vulkan 上运行 OpenGL 或 DX,和/或在 Metal、DX、OpenGL 等上运行 Vulkan。
  • 其中一些分层选项可以堆叠。例如,Zink 和 DXVK 可以在 MoltenVK 之上运行,提供 OpenGL-over-Vulkan-over-Metal 和 DX-over-Vulkan-over-Metal 功能。
  • 就 Vulkan 而言,MoltenVK具有良好的性能和良好的行业吸引力,被许多从 Windows 移植过来的 AAA 游戏所使用,或者运行在 Wine 之上。如果有人有任何疑问,或者想要询问其中一些游戏开发者,我建议在 MoltenVK讨论区提问。
  • MetalANGLE已成为 OpenGL ES 的另一个开源选项。