ios - iPhone X 上的 iOS 12 是否在 Metal 之上渲染 OpenGL ES?有什么办法可以避免吗?

标签 ios opengl-es tvos metal

所以我遇到了一个奇怪的问题。我正在移植 modern source port iOS 和 tvOS 的旧游戏引擎。它是使用 OpenGL 编写的,我发现了一个 fork它使用 OpenGL ES 并且我已经能够将两者结合到 Frankenstein 中,它实际上现在可以在 iOS 和 tvOS 设备上成功运行。

这是奇怪的部分 - 部分游戏无法在我的 iPhone X 上正确呈现,但它们在我的 iPad Air 2 和 Apple TV(第 4 代)上可以正确呈现。

我在输出窗口中的一连串消息中注意到引擎输出渲染器信息的位置,在 iPhone X 上它说

OpenGL 版本:OpenGL ES 2.0 Metal 58.4

而在 iPad Air 2 上它说

OpenGL 版本:OpenGL ES 2.0 A8X GPU - 130.1

“OpenGL ES Metal”对我来说听起来像是“Jumbo Shrimp”,因为它们显然不是一回事。如果我猜的话,我会说 iPhone X 上的 OpenGL ES 驱动程序运行在某种 Metal 转换层之上,这可能是苹果公司在OpenGL ES 弃用。

但无论出于何种原因,它都破坏了我的游戏引擎,尽管我很擅长让代码协同工作,但我对图形编码的了解还不够,甚至不知道从哪里寻找改变的东西才能工作。

显然,正确的答案是解决导致问题的任何问题,但作为短期解决方案,我很好奇是否有任何方法可以让 iOS 上的游戏在其之上使用 OpenGL ES Metal ? (如果这确实是正在发生的事情)


因此,就像 Brad Larson 在下面所说的那样,答案是:OpenGL ES 是在 Metal 之上运行的,不,这是无法避免的。但是,如果其他人遇到这个问题,为了将来引用,我在另一个 SO 答案的帮助下解决了真正的潜在问题:

WebGL GLSL fragment shader not working on iOS

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

最佳答案

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

来自Roblox Metal retrospective :

It is also worth noting that there is no GL driver on iOS 10 on the newest iPhones, apparently. GL is implemented on top of Metal, which means using OpenGL is only really saving you a bit of development effort – not that much, considering that the promise of “write once, run anywhere” that OpenGL has does not really work out on mobile.

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

Profile of OpenGL ES code, showing AppleMetalGLRenderer

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

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

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

关于ios - iPhone X 上的 iOS 12 是否在 Metal 之上渲染 OpenGL ES?有什么办法可以避免吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55066901/

相关文章:

ios - Adcolony 广告并非每次都有效

iOS 代码正在加载错误的 nib 文件?

iphone - 使用深度缓冲区而不是模板缓冲区进行裁剪

iphone - iPhone 上的 glgConvertTo_32

ios - 由于代码生成核心数据问题,Swift 3 Xcode 8 无法存档应用程序

tvos - 在 TVML 应用程序中更改 XMLHttpRequest 的用户代理

HTML - srcset 不能使用 w?不产生图像?

ios - XCODE 6/Swift - 是否可以在未发布的 IOS 应用程序上预览 admobs?

android - OpenGL ES 2.0 PNG alpha channel

objective-c - 如何使用swift检测tvOS越狱