在OpenGL ES for iPhone中请求DepthBuffer

Ale*_*ill 3 iphone opengl-es objective-c

我正在iPhone上创建一个3D OpenGL ES视图,并且想要设置一个深度缓冲区,所以我可以使用它.我正在打电话glEnable(GL_DEPTH_TEST)等等,但因为我没有设置z-buffer,它什么也没做.

我正在寻找一个等效的电话 glutInitDisplayMode(GLUT_DEPTH)

任何帮助都是最受欢迎的.谢谢!

Tom*_*mmy 7

你怀疑,你没有深度缓冲.您需要在您创建的任何使用a CAEAGLLayer作为其图层的UIView子类中将深度缓冲区附加到帧缓冲区.

假设您正在使用Apple的OpenGL ES Xcode模板,相关的UIView子类是EAGLView.其中有一个方法createFramebuffer,它负责创建帧缓冲区.最初它会说:

- (void)createFramebuffer
{
    if (context && !defaultFramebuffer)
    {
        [EAGLContext setCurrentContext:context];

        // Create default framebuffer object.
        glGenFramebuffers(1, &defaultFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

        // Create color render buffer and allocate backing store.
        glGenRenderbuffers(1, &colorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}
Run Code Online (Sandbox Code Playgroud)

它的作用是生成并绑定帧缓冲区,然后生成并绑定颜色渲染缓冲区,为颜色缓冲区提供CAEAGLLayer附带的固有存储,抓取帧尺寸以供日后使用,并将颜色缓冲区附加到渲染缓冲区.

您还需要创建和附加深度缓冲区.这应该是一样简单(为depthRenderbuffer添加一个合适的实例变量;直接在这里输入):

glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
Run Code Online (Sandbox Code Playgroud)

它看起来像它做什么 - 生成并绑定渲染缓冲区,将其存储分配为与颜色缓冲区相同尺寸的16位深度缓冲区,然后将其附加到帧缓冲区.

所以,总计(未经测试):

- (void)createFramebuffer
{
    if (context && !defaultFramebuffer)
    {
        [EAGLContext setCurrentContext:context];

        // Create default framebuffer object.
        glGenFramebuffers(1, &defaultFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

        // Create color render buffer and allocate backing store.
        glGenRenderbuffers(1, &colorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

        // Create depth render buffer and allocate backing store.
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}
Run Code Online (Sandbox Code Playgroud)