iPhone X上的iOS 12是否在Metal上呈现OpenGL ES?有没有办法避免它?

问题描述 投票:4回答:1

所以我有一个奇怪的问题。我正在将旧游戏引擎的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

基本上着色器的浮点精度需要从lowpmediump升级到highp

ios opengl-es tvos metal
1个回答
6
投票

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

来自Roblox Metal retrospective

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

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

Profile of OpenGL ES code, showing AppleMetalGLRenderer

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

我可以说,没有办法绕过这个,这就是现代iOS版本的渲染架构。也就是说,我没有看到这改变了我的OpenGL ES代码的行为。我看到不同的iOS GPU由于其硬件而产生略微不同的渲染行为,因此您可能遇到特定于设备的东西。

检查涉及精确限定符,Z-fighting,着色器中除零等的常见嫌疑人,并查看其中一个是否弄乱了渲染。这些都是我见过新设备世代破坏渲染的地方。

© www.soinside.com 2019 - 2024. All rights reserved.