所以我有一个奇怪的问题。我正在将旧游戏引擎的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驱动程序运行在某种金属转换层之上,这可能是Apple的长期计划,在此之后进行某种未来验证。 OpenGL ES弃用。
但无论出于什么原因,它打破了我的游戏引擎,虽然我在制作代码时很不错,但我对图形编码知之甚少,甚至不知道在哪里可以改变工作方式。
显然,正确的答案是修复引起问题的任何问题,但作为一个短期修复,我很好奇是否有任何办法让iOS上的游戏不在Metal上使用OpenGL ES? (如果确实发生了什么)
所以,就像Brad Larson在下面所说的那样,答案是:是的OpenGL ES是在Metal之上运行而不是,它是无法避免的。但是为了将来参考如果其他人遇到这个问题我在另一个SO答案的帮助下解决了真正的潜在问题:
WebGL GLSL fragment shader not working on iOS
基本上着色器的浮点精度需要从lowp
和mediump
升级到highp
是的,在最近的iOS版本中,OpenGL ES实际上是Metal的接口(因为我相信10,如果我没有记错的话)。
值得注意的是,最新的iPhone上iOS 10上没有GL驱动程序。 GL是在Metal之上实现的,这意味着使用OpenGL只会真正为您节省一些开发工作 - 不是那么多,考虑到OpenGL在移动设备上实现的“一次编写,随处运行”的承诺。
您可以通过在现代iOS版本上分析OpenGL ES代码来自行验证:
除了上述内容之外,您还会看到特定于Metal的操作,例如-[MTLIOAccelCommandQueue submitCommandBuffers:count:]
出现在OpenGL ES应用程序的概要分析中。
我可以说,没有办法绕过这个,这就是现代iOS版本的渲染架构。也就是说,我没有看到这改变了我的OpenGL ES代码的行为。我看到不同的iOS GPU由于其硬件而产生略微不同的渲染行为,因此您可能遇到特定于设备的东西。
检查涉及精确限定符,Z-fighting,着色器中除零等的常见嫌疑人,并查看其中一个是否弄乱了渲染。这些都是我见过新设备世代破坏渲染的地方。