在OpenGLES中处理iPhone方向的变化

时间:2011-09-05 21:38:07

标签: iphone opengl-es uiinterfaceorientation

当设备方向发生变化时,我的OpenGLES视图出现问题。我正在使用Jeff Lamarche's Xcode template

如果设置了AutoresizeMask,则在GLView上调用- (void)layoutSubviews。当发生这种情况时,我正在绘制的对象消失。 OpenGL视图仍然部分工作,因为我可以更改背景颜色并查看更改。

如果设置了AutoresizeMask ,则视图会旋转,OpenGL对象仍然可见,但视图的大小不正确。

这表明layoutSubviews中的某些内容在多次调用时会导致问题。

以下是显示问题的drawView的一些非常基本的代码

- (void)drawView:(UIView *)theView
{    
    Vertex3D    vertex1 = Vertex3DMake(0.0, 1.0, -3.0);
    Vertex3D    vertex2 = Vertex3DMake(1.0, 0.0, -3.0);
    Vertex3D    vertex3 = Vertex3DMake(-1.0, 0.0, -3.0);
    Triangle3D  triangle = Triangle3DMake(vertex1, vertex2, vertex3);

    glLoadIdentity();
    glClearColor(0.7, 0.7, 0.7, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColor4f(1.0, 0.0, 0.0, 1.0);
    glVertexPointer(3, GL_FLOAT, 0, &triangle);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
}

使用此代码旋转设备时,屏幕上的三角形消失。重新定向回到肖像也不会再次出现。

我不应该允许GLView重定向或者这是我的OpenGL代码中的错误吗?

1 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但我相信layoutSubviews你需要删除并重新创建你的帧缓冲以匹配新的大小。如果你去here(我认为你已经注册了Apple开发者计划)并查看视频“iOS 5上的OpenGL最佳实践”,那么演讲者会谈到轮换,之前建议如何手动完成你的OpenGL是因为性能问题,但接着说现在它可以通过使用内置的旋转轻松处理。发言者还提到,如果您使用的是GLKView,它会代表您调整帧缓冲区的大小。

另外,我不确定你的意思是“很多开发人员都遇到了这个问题”。谷歌和Stack Overflow内部的一些粗略搜索没有向我透露任何有这个问题的人;我怀疑你的代码可能有问题。

我还关注了你与Jeff Learche的Xcode模板的链接,并且Xcode 4模板的链接被打破了 - 这可能是因为它是从2011年5月开始。或许只是查看GLK框架,如果你的OpenGL需求不是太多专门?