Offscreen-Framebuffer in OpenGL

Ich bin momentan dabei, ein iPhone-Spiel mit OpenGL, und ich möchte zu ziehen, auf eine offscreen-framebuffer, dann mit, dass die framebuffer als textur für das zeichnen auf dem Bildschirm. Ich basiert mein code aus Apple und die GLSprite Beispiel, aber es scheint, ich bin nicht tun es richtig, wenn es um die Umstellung der Zeichnung target, da bekomme ich nur eine leere textur. Der code, den ich verwende, ist unten. Was ist falsch? Was ist der beste Weg, um das Rendern einer textur on-the-fly?

Dem Erstellen eines Offscreen-Framebuffer unten ist mir das 8cd6-Fehler-code.

Erstellung der Bildschirm-Framebuffer

glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    return NO;
}

Erstellen eines Offscreen-Framebuffer

glGenFramebuffers(1, &offscreenFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, offscreenFramebuffer);

glGenTextures(1,&framebufferTexture);
glBindTexture(GL_TEXTURE_2D, framebufferTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, framebufferTexture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"ERROR: %x", status);
}

Zeichnung, Loop:

glBindTexture(GL_TEXTURE_2D,textureFromFile); //Switch to a texture from a file
glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer); //Switch to the offscreen framebuffer
//Render the texture to be used later
glBindTexture(GL_TEXTURE_2D,framebufferTexture); //Switch to the offscreen framebuffer's texture
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); //Switch to the screen framebuffer
//Do the drawing using the texture rendered just before, and present this to the screen.

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
  • Als Hinweis, 0x8CD6 ist GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES (siehe glext.h).
  • So... Was mache ich falsch? Wie kann ich es beheben?
  • Schauen Sie sich den code, der in dieser Frage: stackoverflow.com/questions/22548208/... sollte es hilft. Der entscheidende Punkt ist, nach dem zeichnen der textur zu, die offscreen sind, FBO, müssen Sie erneut binden, wieder auf den vorherigen Standard-framebuffer. Und dann binden Sie die Vorherige textur und dann ziehen Sie auf dem Bildschirm. Hoffe, das hilft.
InformationsquelleAutor HLorenzi | 2012-01-30
Schreibe einen Kommentar