所以我有一个奇怪的问题。我正在将旧游戏引擎的现代源端口移植到 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 答案的帮助下解决了真正的潜在问题:
lowp
基本上着色器的浮点精度需要mediump
升级highp