Pregunta

I seguido un tutorial usando tampón de profundidad en Es OpenGL 1.1. Pero uso de OpenGL ES 2.0. Los resultados de código implementados en un error: No se pudo realizar completa 8cd6 framebuffer objeto. Ver código implementado a continuación:

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

Saludos Niclas

¿Fue útil?

Solución

El problema es que estás dos veces vinculante almacenamiento a su renderbuffer profundidad, y nunca a su renderbuffer color. El mensaje -renderbufferStorage:fromDrawable: a su EAGLContext se une un dispositivo de almacenamiento a la renderbuffer momento ligado, que en su caso es el renderbuffer profundidad. A continuación, estás almacenamiento de unión a nuevo utilizando la llamada glRenderbufferStorage.

La solución es obligar a la renderbuffer color antes de enviar el mensaje de almacenamiento, por lo que el almacenamiento se pone límites a eso. Es decir, insertar una línea de glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); directamente por encima del mensaje, después de crear su renderbuffer profundidad. Se debe trabajar, yo era capaz de reproducir el error y posteriormente resolverlo de esta manera.

NB. Siempre asegúrese de que están obligados los buffers correctas. Se puede comprobar utilizando glGetIntegerv() para la unión, y glGetRenderbufferParameteriv() para parámetros adicionales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top