【问题标题】:Is iOS 12 on the iPhone X rendering OpenGL ES on top of Metal? And is there any way to avoid it?iPhone X 上的 iOS 12 是否在 Metal 之上渲染 OpenGL ES?有什么办法可以避免吗?
【发布时间】: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的浮点精度需要从lowpmediump升级到highp

【问题讨论】:

  • 我有时认为世界上没有人知道这个问题的答案!我已经放弃尝试解决它。 :/ 我真的不认为 Apple 的任何人都知道。
  • 答案很可能是:不,没有办法避免它,而您遇到的是仿真中的错误。但我想我还是会在这里问。
  • 对。这是一个伟大而关键的问题,汤姆。非常不幸,我敢打赌没人能回答:/ :/

标签: ios opengl-es tvos metal


【解决方案1】:

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

来自Roblox Metal retrospective

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

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

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

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

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

【讨论】:

  • 谢谢,我想可能是这种情况,但我想确定一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多