0

我有一个基于 Apple 的 EAGLView 示例的 3D 项目。

我的上下文有一个非常奇怪的错误(我认为),我的上下文是通过使用创建的:

[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];

在初始化 3D 视图时,它可以工作,在布局子视图中,我的 frameBuffer 被再次破坏创建。但在某些情况下,不会创建帧缓冲区。我用调试器搜索我发现问题来自上下文“创建”:

- (BOOL)createFramebuffer
{
    NSLog(@"[EAGLVIEW] create framebuffer");

    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);


    //////// HERE, some time the context is 0 /////////
    [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);


    // On génère le tampon de profondeur -- bah oui, on fait de la 3D
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    // On paramètre le tampon :
    // - avec les dimensions que l'on veut
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    //glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);
    // - avec la profondeur que l'on veut
    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;
}

我不明白为什么它工作或不工作。当我有这个错误时,我转动我的 iPhone 强制执行 layoutSubview,它的工作。这很奇怪。

第二次没有创建上下文的原因是什么,然后就可以了。

4

1 回答 1

0

您还没有发布代码,显示您如何实际创建上下文,只是使用它。您的上下文创建应如下所示

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

if (!context || ![EAGLContext setCurrentContext:context])
    return false;

如果上下文为 0(这意味着 nil),那么您将事先检测到它。

于 2010-09-16T11:45:04.907 回答