Pergunta

Eu segui um tutorial usando buffer de profundidade no OpenGL ES 1.1. Mas eu uso o OpenGL ES 2.0. O código implementado resulta em um erro: falhou ao fazer o objeto FrameBuffer completo 8cd6. Veja o código implementado abaixo:

 (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);

        // Create depth render buffer
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    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));
    }
}

Atenciosamente Niclas

Foi útil?

Solução

O problema é que você está ligando duas vezes o armazenamento ao seu renderbuffer de profundidade e nunca à sua cor de cor. o -renderbufferStorage:fromDrawable: A mensagem ao seu EAGLCONTEXT liga um armazenamento ao renderbuffer atualmente encadernado, que no seu caso é o renderbuffer de profundidade. Seguindo, você está vinculando o armazenamento a ele novamente usando o glRenderbufferStorage ligar.

A solução é vincular o renderbuffer de cores antes de enviar a mensagem de armazenamento, para que o armazenamento obtenha limites para isso. Isto é, insira uma linha glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); Diretamente acima da mensagem, depois de criar seu renderbuffer de profundidade. Deveria funcionar, pude reproduzir seu erro e, posteriormente, resolvê -lo dessa maneira.

Nb. Sempre verifique se os buffers corretos estão vinculados. Você pode verificar usando glGetIntegerv() para a ligação e glGetRenderbufferParameteriv() Para parâmetros adicionais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top