最近我决定再次选择我几年前开始提交到iOS应用商店的游戏开发项目。我发现我的应用程序在iPhone5s上显示黑屏,即使它运行正常。我有iPhone 3GS并且已经在iPhone 4s上进行了测试,它运行正常。
这里有一个帖子,其中有人有类似的问题,说iPhone的后期版本向后兼容OpenGLES 1.1,而且他的代码中只是错误。但实际的线程没有说明他是如何解决它的。资料来源:Similar Stack Overflow Thread
我知道iPhone的所有版本都应该与OpenGLES 1.1向后兼容,但似乎新手机已经发生了变化。 (也许它与金属有关?我在研究中注意到他们在iPhone 5s和更高版本上实现了金属。)
我一直在搜索这个主题并且找不到任何东西,也许将我的项目移植到OpenGLES 2会更好吗?有谁知道这个奇怪的iPhone版本的bug?
答案 0 :(得分:1)
对于64位设备而言,OpenGL(不是特定于版本)的问题更加严格:iPhone5s +。 CGFloats可以在这些设备上运行(这包括CGPoints,因为它们包含CGFloats。)使用GLFloats,因为这是由OpenGL库为此目的提供的。
所以在我的例子中,我做了一些结构来代替CGFloats,例如:
//structure to replace CG Point for 64-bit device compatability
typedef struct {
GLfloat x;
GLfloat y;
} GLPoint;
//returns a GLPoint to replace CGPoint structure to support 64-bit devices
static inline GLPoint GLPointMake(GLfloat x, GLfloat y) {
return (GLPoint) {x, y};
}
我在代码中使用此代替CGPoints来解决此问题。当使用顶点在64位设备上渲染时,此代码将正确移植。
答案 1 :(得分:1)
当您告诉OpenGL您提供GL_FLOAT
数据时,它需要GLfloat
个数据。 GLfloat
是float
的typedef。
CGFloat
是32位设备上的float
和64位设备上的double
的typedef。
因此,问题是假设GLfloat
和CGFloat
是同一类型的不同名称。他们不是。
顺便说一下,这也是Apple现在提供GLKVector2
et seq的部分原因。如果你想要方便的话,你应该使用它,make函数和GLKit的所有其余部分。