3

升级到 iOS SDK 4.2 我在我的应用程序中遇到了一些不当行为(这里询问了另一种行为)。我要请你帮忙的一个关于 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];
}

神奇地模型出现了,甚至背景也被着色了。

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

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

更新 这发生在模拟器上(目前无法在设备上测试)。如果这是一个公认的错误,有没有人参考 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)它看起来正确渲染。在某种程度上它与视图尺寸有关

4

3 回答 3

13

我花了很长时间才发现这一点。根本没有很好的记录,但它在苹果文档中。在 os 4.2 及更高版本上,您需要 EAGLview 大小在两个维度上都是 32 像素的倍数才能正常工作。

于 2010-11-29T20:24:26.057 回答
2

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

于 2010-11-24T19:44:26.327 回答
1

您如何设置 OpenGL 托管层及其支持的视图?当我尝试这里这里的 OpenGL ES 示例应用程序时,它们都可以在 4.2 模拟器和设备上正常运行。

也许您可以将这些示例中使用的初始化与您自己的进行比较,看看在设置过程中是否有一些您可能遗漏的东西。

于 2010-11-25T02:32:59.547 回答