OpenGL ES 1.1 iPhone5+ IOS 8 黑屏
OpenGL ES 1.1 iPhone5+ IOS 8 Black Screen
最近我决定重新开始几年前开始的游戏开发项目,以提交到 iOS 应用商店。我发现我的应用程序在 iPhone5s 及更高版本上显示黑屏,尽管它运行正常。我有一个 iPhone 3GS 并在 iPhone 4s 上测试过它,它工作正常。
这里有一个线程,其中有人有类似的问题说 iPhone 的更高版本向后兼容 OpenGLES 1.1,这只是他的代码中的错误。但是实际线程并没有具体说明他是如何解决的。资料来源:Similar Stack Overflow Thread
我知道 iPhone 的所有版本都应该向后兼容 OpenGLES 1.1,但新手机似乎发生了一些变化。 (也许它与金属有关?我在研究中注意到他们在 iPhone 5s 和更高版本上实现了金属。)
我一直在搜索这个主题,但找不到任何东西,也许将我的项目移植到 OpenGLES 2 会更好?有人知道这个奇怪的 iPhone 版本错误吗?
事实证明,这是 OpenGL(非特定版本)在 64 位设备(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 位设备上渲染时,此代码将正确移植。
当您告诉 OpenGL 您正在提供 GL_FLOAT
数据时,它需要 GLfloat
数据。 GLfloat
是 float
.
的类型定义
CGFloat
在 32 位设备上是 float
的类型定义,在 64 位设备上是 double
。
所以这个问题是一个错误的假设,即 GLfloat
和 CGFloat
是同一类型的不同名称。他们不是。
顺便说一下,这也是 Apple 现在提供 GLKVector2
et seq 的部分原因。如果你想要方便的话,你应该使用它,它的 make 函数和 GLKit 的所有其他部分。
最近我决定重新开始几年前开始的游戏开发项目,以提交到 iOS 应用商店。我发现我的应用程序在 iPhone5s 及更高版本上显示黑屏,尽管它运行正常。我有一个 iPhone 3GS 并在 iPhone 4s 上测试过它,它工作正常。
这里有一个线程,其中有人有类似的问题说 iPhone 的更高版本向后兼容 OpenGLES 1.1,这只是他的代码中的错误。但是实际线程并没有具体说明他是如何解决的。资料来源:Similar Stack Overflow Thread
我知道 iPhone 的所有版本都应该向后兼容 OpenGLES 1.1,但新手机似乎发生了一些变化。 (也许它与金属有关?我在研究中注意到他们在 iPhone 5s 和更高版本上实现了金属。)
我一直在搜索这个主题,但找不到任何东西,也许将我的项目移植到 OpenGLES 2 会更好?有人知道这个奇怪的 iPhone 版本错误吗?
事实证明,这是 OpenGL(非特定版本)在 64 位设备(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 位设备上渲染时,此代码将正确移植。
当您告诉 OpenGL 您正在提供 GL_FLOAT
数据时,它需要 GLfloat
数据。 GLfloat
是 float
.
CGFloat
在 32 位设备上是 float
的类型定义,在 64 位设备上是 double
。
所以这个问题是一个错误的假设,即 GLfloat
和 CGFloat
是同一类型的不同名称。他们不是。
顺便说一下,这也是 Apple 现在提供 GLKVector2
et seq 的部分原因。如果你想要方便的话,你应该使用它,它的 make 函数和 GLKit 的所有其他部分。