【问题标题】:What's wrong with using depth render buffer? OpenGL ES 2.0使用深度渲染缓冲区有什么问题? OpenGL ES 2.0
【发布时间】:2010-12-07 15:12:13
【问题描述】:

我使用这个代码:

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

    if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders])
    {
        [self release];
        return nil;
    }

    glGenFramebuffers(1, &defaultFramebuffer);
    glGenRenderbuffers(1, &colorRenderbuffer);
    glGenRenderbuffers(1, &depthRenderbuffer);

    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

但是当我运行应用程序时,我看到紫屏?这段代码有什么问题?

【问题讨论】:

    标签: iphone opengl-es depth-buffer


    【解决方案1】:

    我看不到您将颜色渲染缓冲区绑定到要在其上显示的 CAEAGLLayer 的位置(尽管稍后可能会发生),而且我看不到您启用深度测试。另外,如果我没记错的话,你需要绑定颜色渲染缓冲区,为此调用glFramebufferRenderbuffer(),然后绑定深度渲染缓冲区并再次调用它。

    以下是我用来在 OpenGL ES 2.0 上设置类似显示的代码:

    glEnable(GL_DEPTH_TEST);
    
    glGenFramebuffers(1, &viewFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
    
    glGenRenderbuffers(1, &viewRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
    
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
    
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);
    
    glGenRenderbuffers(1, &depthRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
    
    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
    {
        NSLog(@"Failure with framebuffer generation");
        return NO;
    }
    

    此应用程序的完整代码可在here获取。

    【讨论】:

      【解决方案2】:

      我知道这有多大了,但我做了完全相同的事情并得到完全相同的结果,所以我想我会做出贡献。在我的项目中发生的情况是,在设置渲染缓冲区时,我在自动完成时按回车键太快,导致:

      glGenBuffers(1, &_colorRenderBuffer);
      

      而不是这个:

      glGenRenderbuffers(1, &_colorRenderBuffer);
      

      最终结果:紫屏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        相关资源
        最近更新 更多