Frage

folgte ich ein Tutorial mit Tiefenpuffer in OpenGL ES 1.1. Aber ich benutze OpenGL 2.0 ES. Die implementierten Code führt zu einem Fehler: Fehler beim vollständigen Framebuffer-Objekt 8cd6 zu machen. Siehe implementiert Code unten:

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

Viele Grüße Niclas

War es hilfreich?

Lösung

Das Problem ist, dass Sie zweimal Bindungsspeicher auf Ihre Tiefen renderbuffer sind, und nie auf Ihre Farbe renderbuffer. Die -renderbufferStorage:fromDrawable: Nachricht an Ihre EAGLContext bindet einen Speicher auf die zur Zeit gebunden renderbuffer, die in Ihrem Fall sind die Tiefen renderbuffer. Nachfolgend sind verbindlich Sie Speicher, um es wieder den glRenderbufferStorage Anruf mit.

Die Lösung ist die Farbe renderbuffer vor dem Senden des Speicher Nachricht zu binden, so dass die Speichergrenzen zu, dass bekommen. Das heißt, legen Sie eine Zeile glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); direkt oberhalb der Nachricht, nachdem Sie Ihre Tiefe renderbuffer erstellen. Es sollte funktionieren, ich in der Lage war Ihr Fehler zu reproduzieren und anschließend auf diese Weise zu lösen.

NB. Achten Sie immer darauf die richtigen Puffer gebunden sind. Sie können mit glGetIntegerv() für die Bindung und glGetRenderbufferParameteriv() für zusätzliche Parameter überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top