当设备方向发生变化时,我的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代码中的错误吗?
答案 0 :(得分:1)
如果我错了,请纠正我,但我相信layoutSubviews
你需要删除并重新创建你的帧缓冲以匹配新的大小。如果你去here(我认为你已经注册了Apple开发者计划)并查看视频“iOS 5上的OpenGL最佳实践”,那么演讲者会谈到轮换,之前建议如何手动完成你的OpenGL是因为性能问题,但接着说现在它可以通过使用内置的旋转轻松处理。发言者还提到,如果您使用的是GLKView
,它会代表您调整帧缓冲区的大小。
另外,我不确定你的意思是“很多开发人员都遇到了这个问题”。谷歌和Stack Overflow内部的一些粗略搜索没有向我透露任何有这个问题的人;我怀疑你的代码可能有问题。
我还关注了你与Jeff Learche的Xcode模板的链接,并且Xcode 4模板的链接被打破了 - 这可能是因为它是从2011年5月开始。或许只是查看GLK框架,如果你的OpenGL需求不是太多专门?