为什么我的EAGLVIew不再在iOS 4.2中渲染?

时间:2010-11-24 18:39:32

标签: iphone opengl-es ios4 rendering eaglview

升级到iOS SDK 4.2我在我的应用程序中遇到了一些错误行为(另一个被问到here)。我要问你的帮助是关于一个OpenGL视图(一个EAGLView子类),它不再渲染我正在放入的3d模型。

视图已分配,它似乎识别出手势,但其内容不是可见(我已经检查过它是关于视图而不是错放的通过为背景着色模型:它不会通过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];
}

并且神奇地模型出现,甚至背景也会变色。

我有一个方法可以调整它的大小并使其恢复到之前的帧和中心位置,当它被调用时,视图再次变为'empty'

之前 有什么建议吗? (如果需要,我可以发布更多代码)

更新 这发生在模拟器上(目前无法在设备上进行测试)。如果这是一个公认的错误,有没有人引用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

如果我创建视图,为其提供全屏帧(320x480),则显示正确呈现。在某种程度上,它与视图尺寸

有关

3 个答案:

答案 0 :(得分:13)

我花了很长时间才发现这一点。根本没有完整记录,但它在苹果文档中。在操作系统4.2及更高版本中,您需要EAGLview大小为两个维度中32像素的倍数才能生效。

答案 1 :(得分:2)

这是在模拟器中吗?如果是这样,那么这是iOS 4.2模拟器中的一个已知错误。此错误不会影响设备本身。

答案 2 :(得分:1)

您如何设置OpenGL托管层及其支持的视图?当我尝试使用herehere的OpenGL ES示例应用程序时,两者在4.2模拟器和设备上都运行良好。

也许您可以将这些示例中使用的初始化与您自己的初始化进行比较,并查看设置过程中是否存在您可能缺少的内容。