代码之家  ›  专栏  ›  技术社区  ›  rano

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

  •  3
  • rano  · 技术社区  · 14 年前

    升级到iOSSDK4.2时,我的应用程序中出现了一些错误行为(另一个问题是 here ). 我要向你求助的是一个OpenGL视图(一个eagleview子类),它不再呈现我正在放置的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];
    }
    

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

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

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

    更新 这是在模拟器上发生的(目前无法在设备上测试)。如果这是一个公认的错误,有没有人从苹果文档的参考?

    更新2 我使用的是OpenGL ES 1.1而不是2.0。

    这是我在伊格维尤做的事 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 回复  |  直到 7 年前
        1
  •  13
  •   Mike    14 年前

    我花了很长时间才发现。没有很好的文档记录,但它在苹果文档中。在OS4.2及更高版本上,您需要EagleView的大小是两个维度上32像素的倍数才能工作。

        2
  •  2
  •   Frogblast    14 年前

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

        3
  •  1
  •   Brad Larson    14 年前

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

    也许您可以将这些示例中使用的初始化与您自己的进行比较,看看在安装过程中是否遗漏了某些内容。

    推荐文章