【发布时间】:2013-10-15 09:22:20
【问题描述】:
我正在编写一个涉及 OpenGL ES 2.0 的软件。 这只是使用 GLSL 呈现带有一些插件特殊效果的照片。
一切正常,着色器在 iPhone 4、iPhone 4s 和带有 IOS7 的 iPhone 5 上表现良好。但是当我使用安装了 IOS7 的 iPhone 5S 测试该软件时,OpenGL 只为我编写的所有 GLSL 着色器提供了清晰的颜色(能够使用 glClearColor 更改)。不能在最新的设备上工作肯定是不可接受的。
iPhone 5S 上的另一个异常现象是每次第一次调用glDrawElements(如果重要的话我使用VBO)在使用的opengl 程序编译之后(每次用户切换特效时都会编译一个新的opengl shader程序),会阻塞当前线程10秒左右。
我尝试使用 XCode 5 和 4.6 进行编译,两者都给出了相同的结果(在 iPhone 5s 以外的所有设备上都可以)。
该项目在 iPhone 5 上安装的 IOS7 上工作,所以问题不应该是 os 版本或 SDK 版本。我怀疑新的 GPU 可能是原因,但我不知道如何修复它,甚至不知道代码在哪里失败。我花了一整天才发现 glDrawElements 问题。
该软件的代码很大,我不可能在我的问题中发布所有代码。如果有人可以为我提供一些帮助或只是一些想法,我将不胜感激。
为了让问题更简洁,我的 OpenGL 着色器似乎在最新的 iPhone GPU 上失败了。所以我想知道是否:
- 最新的 Apple A7 GPU 中断支持某些 OpenGL ES 2.0 功能
- 使用 iPhone 5s 创建顶点缓冲区对象 (vbo) 存在一些限制
- RenderBuffer、FrameBuffer 和 TextureBuffer(用于执行多通道着色器)的使用在 iPhone 5s 上有任何区别
这些都是我现在能想到的可疑部分,但我不知道如何测试它们,因为我现在连一个渲染帧都没有。
【问题讨论】:
-
我唯一能想到的是 5S 具有极其惰性的状态设置和/或 5 所没有的严格验证规则。通常当您第一次绑定资源并使用它时,它会花费很长时间,这部分是由于延迟设置/分配和验证。不要急于责备
glDrawElements (...),当你进行draw call时最终提交的看似无关的操作数量会让你感到惊讶。它可能与您的顶点数据无关,而与资源分配/验证有关。 -
谢谢你的小费。顺便说一句,我没有找到任何文件谈论 5s 和它的先验之间的 opengl 的区别。如果你能给我一些,我会很高兴的。 @AndonM.Coleman
-
我也有用户报告 IOS 应用存在类似问题。 OpenGLES 2.0 GLKView 在 iPhone 5s 上显示为灰色/清晰,但在任何其他 Apple 设备上均不显示。我仍在尝试确定原因。第一步是将开发环境升级到 Xcode 5 & IOS 7 SDK。
-
我以某种方式解决了我的问题。首先,升级 XCode 和 SDK 是相当可观的,但并没有帮助。我发现新 iPhone 5s GPU 上的 OpenGLES 实现比以前严格得多。当我用 VAO 包装我的 VBO 并将我的着色器中的所有整数更改为浮点数时,我的应用程序再次开始工作。我仍然不确定为什么这样做会起作用,但现在病已经痊愈了。
标签: iphone ios7 opengl-es-2.0