9

所以我有一个奇怪的问题。我正在将旧游戏引擎的现代源端口移植到 iOS 和 tvOS。它是使用 OpenGL 编写的,我发现了一个使用 OpenGL ES 的分支,我已经能够将 Frankenstein 将两者结合到它现在可以在 iOS 和 tvOS 设备上成功运行的位置。

这是奇怪的部分——部分游戏在我的 iPhone X 上无法正确渲染,但在我的 iPad Air 2 和 Apple TV(第 4 代)上却可以正确渲染。

我注意到在输出窗口中的一连串消息中,引擎输出渲染器信息的位置,在 iPhone X 上它说

OpenGL version: OpenGL ES 2.0 Metal 58.4

而在 iPad Air 2 上,它说

OpenGL version: OpenGL ES 2.0 A8X GPU - 130.1

“OpenGL ES Metal”对我来说听起来像“Jumbo Shrimp”,因为它们显然不是一回事。如果我猜的话,我会说 iPhone X 上的 OpenGL ES 驱动程序运行在某种金属转换层之上,这可能是苹果公司在OpenGL ES 弃用。

但无论出于何种原因,它破坏了我的游戏引擎,虽然我很擅长让代码协同工作,但我对图形编码的了解还不够,甚至不知道在哪里可以改变工作。

显然,正确的答案是解决导致问题的任何原因,但作为短期修复,我很好奇是否有任何方法可以让 iOS 上的游戏不在Metal 之上使用 OpenGL ES?(如果这确实是正在发生的事情)


所以,就像 Brad Larson 在下面所说的那样,答案是:是的,OpenGL ES 是在 Metal 之上运行的,不,这是无法避免的。但是,如果其他人遇到这个问题,为了将来参考,我在另一个 SO 答案的帮助下解决了真正的潜在问题:

WebGL GLSL 片段着色器在 iOS 上不起作用

lowp基本上着色器的浮点精度需要mediump升级highp

4

1 回答 1

11

是的,OpenGL ES 实际上是最近 iOS 版本上的 Metal 接口(如果我没记错的话,我相信是 10)。

来自Roblox 金属回顾展

还值得注意的是,显然,最新款 iPhone 上的 iOS 10 上没有 GL 驱动程序。GL 是在 Metal 之上实现的,这意味着使用 OpenGL 只会真正为您节省一点开发工作量——考虑到 OpenGL 所承诺的“一次编写,随处运行”的承诺在移动设备上并没有真正发挥作用,这并没有多少。

您可以通过在现代 iOS 版本上分析 OpenGL ES 代码来自己验证这一点:

OpenGL ES 代码配置文件,显示 AppleMetalGLRenderer

除了上述之外,您还将看到 Metal 特定的操作,例如-[MTLIOAccelCommandQueue submitCommandBuffers:count:]出现在 OpenGL ES 应用程序的分析中。

据我所知,没有办法绕过这一点,这就是在现代 iOS 版本上构建渲染的方式。也就是说,我没有看到这会改变我的 OpenGL ES 代码的行为。我已经看到不同的 iOS GPU 由于其硬件而产生略微不同的渲染行为,因此您可能会遇到特定于设备的问题。

检查涉及精度限定符、Z-fighting、着色器中除零等的常见问题,看看其中一个是否会扰乱您的渲染。这些都是我看到新一代设备破坏我的渲染的地方。

于 2019-03-08T21:41:03.593 回答