在OSXBigSur上使用OpenGL4.x进行开发
据 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 配合使用,那么我还有什么选择呢?
回答
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)之上实现的现有图形引擎也会减轻您的维护负担,但这超出了初始问题的范围。