升级到 iOS SDK 4.2 我的应用程序遇到了一些不当行为(另一个问题是 here )。我要向您寻求帮助的问题涉及 OpenGL View (EAGLView 子类),该 View 不再渲染我放入的 3D 模型。
View 已分配,它似乎可以识别手势,但其内容不可见(我已经检查过它是关于 View 的,而不是放错的通过为背景着色来建模:它不通过 glClearColor()
来着色。
当我双击它时,它会调整大小(它会全屏显示,在此之前它有点 UIVIew)调用此方法:
- (void)animateToGrow{
DNSLog(@"grow");
grow = YES;
oldFrame = self.frame;
oldCenter = self.center;
[UIView beginAnimations:@"MoveAndStrech" context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
self.frame = CGRectMake(0, 0, WIDTH, HEIGHT);
self.center = CGPointMake(CENTER_X, CENTER_Y);
[UIView commitAnimations];
[self setupGLPerspectiveNear:0.1 far:1000];
}
神奇地模型出现了,甚至背景也变成了彩色。
我有一个方法可以调整它的大小并使其回到之前的帧和中心位置,当它被调用时, View 再次变为“空”。
之前 有什么建议吗? (如果需要,我可以发布更多代码)
更新 这是在模拟器上发生的(目前无法在设备上进行测试)。如果这是一个已确认的错误,有人可以引用 Apple 文档吗?
更新2 我使用的是 OpenGL ES 1.1,而不是 2.0。
这是我在 EAGLView 的 layoutSubViews
中所做的事情:
- (void)layoutSubviews
{
[EAGLContext setCurrentContext:_context];
[self destroyFramebuffer];
[self createFramebuffer];
[self drawView];
}
这是我的createFramebuffer
- (BOOL)createFramebuffer
{
glGenFramebuffersOES(1, &_viewFramebuffer);
glGenRenderbuffersOES(1, &_viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _viewRenderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &_backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &_backingHeight);
if (_useDepthBuffer)
{
glGenRenderbuffersOES(1, &_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, _backingWidth, _backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderbuffer);
}
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
更新3
如果我创建 View 并为其提供全屏框架 (320x480),它会正确呈现。在某种程度上它与 View 尺寸有关
最佳答案
我花了很长时间才发现这一点。根本没有详细记录,但它在苹果文档中。在 os 4.2 及更高版本上,您需要 EAGLview 大小在两个维度上均为 32 像素的倍数才能正常工作。
关于iphone - 为什么我的 EAGLVIew 在 iOS 4.2 中不再渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270320/