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

Develop using OpenGL 4.x on OSX Big Sur

根据 Apple 的说法,OpenGL is no longer supported. However, it appears v4.1 of OpenGL was supported on many devices 截至 2020 年 7 月 28 日。我有一台 2020 Macbook Pro 16" 型号,它没有出现在上面提供的列表中。虽然我确信某种形式的兼容性存在于我的设备上,我不确定在弃用现代版本时如何使用 OpenGL 进行开发。

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

macOS 上的内置 OpenGL 与 Windows 或 Linux 等其他平台略有不同。在 Windows 上,系统提供的 opengl32.dll 实际上并没有实现 OpenGL,而是一个从显卡供应商提供的驱动程序动态加载功能的代理库。显卡供应商提供独立于 Microsoft 的驱动程序,无需 Microsoft 批准即可实现 OpenGL 功能。

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

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

直接使用特定平台 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,一个开源 OpenGL ES 实现优于其他 API秒。 到目前为止,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 驱动程序 工作 on top of MoltenVK on macOS

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

依靠 Vulkan-on-top-of-Metal 实现可能是最临时的选择,但在 Vulkan 之上开发图形引擎肯定需要更多的努力的OpenGL。但是,无法评论当前的 MoltenVK 实现如何与 Windows 上相同图形硬件(features/performance/limitations)上的本机 Vulkan 实现相比较。当然,使用一些已经在几个图形 APIs (Vulkan/Metal/Direct3D/OpenGL/OpenGL ES) 之上实现的现有图形引擎也会减轻你的维护负担,但这超出了最初问题的范围。

@gkv311 的 很全面。我将添加以下想法 (完全公开,我是 MoltenVK 和 MoltenGL 项目的首席开发人员)

  • 恕我直言,Vulkan 生态系统是跨最多平台进行面向未来的游戏开发的最佳选择。 Here 是 API 分层选项的一个很好的总结,基于该方法,允许选择 运行ning OpenGL 或 DX over Vulkan,and/or Vulkan over Metal,DX,OpenGL等
  • 其中一些分层选项可以堆叠。例如,Zink 和 DXVK 可以 运行 在 MoltenVK 之上,提供 OpenGL-over-Vulkan-over-Metal 和 DX-over-Vulkan-over-Metal 功能。
  • 就 Vulkan 而言,MoltenVK has good performance, and good industry traction, being used by a number of AAA games ported from Windows origins, or running on top of Wine. If anyone has any questions, or wants to query some of those game developers, I suggest asking a question in the MoltenVK Discussions 区域。
  • MetalANGLE 已成为 OpenGL ES 的另一个开源选项。