【发布时间】:2019-07-30 16:53:23
【问题描述】:
所以我遇到了一个奇怪的问题。我正在将旧游戏引擎的modern source port 移植到 iOS 和 tvOS。它是使用 OpenGL 编写的,我发现其中一个使用 OpenGL ES 的 fork 并且我已经能够将 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 上的游戏不在上面使用 OpenGL ES金属? (如果确实是这样的话)
所以,就像 Brad Larson 在下面所说的那样,答案是:是的,OpenGL ES 是在 Metal 之上运行的,不,这是无法避免的。但是,如果其他人遇到此问题,以供将来参考,我在另一个 SO 答案的帮助下解决了真正的潜在问题:
WebGL GLSL fragment shader not working on iOS
基本上shader的浮点精度需要从lowp和mediump升级到highp
【问题讨论】:
-
我有时认为世界上没有人知道这个问题的答案!我已经放弃尝试解决它。 :/ 我真的不认为 Apple 的任何人都知道。
-
答案很可能是:不,没有办法避免它,而您遇到的是仿真中的错误。但我想我还是会在这里问。
-
对。这是一个伟大而关键的问题,汤姆。非常不幸,我敢打赌没人能回答:/ :/