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

标签 iphone opengl-es ios4 rendering eaglview

升级到 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/

相关文章:

c++ - 如何测量从计算到渲染着色器的 GPU 上下文切换

ios - iOS 上的 OpenGL 内存管理

iphone - iPad 特定的 View 在启动时崩溃

xcode - CLLocationManager didUpdateToLocation 与 MKMapView 的 didUpdateUserLocation

iphone - uiTableView 在删除单元格时第二次崩溃

iphone - iOS CoreMotion CMAttitude 相对于北极

android - Android 上的 OpenGL 线段光栅化

iphone - 在 iPhone OS 4.0 上从相机获取曝光值

java - 使用 ACR122 NFC 读卡器读取 apple pay token

ios - 为什么此代码在 64 位构建上表现不同? (iOS/UIColor/UIKeyedArchiver)