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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist einfach: du hast vergessen zu ziehen, um die Bildschirm. Sie wissen, die Standard-framebuffer, was Sie erhalten, wenn Sie
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
Sie Das, was Sie waren, das Rendern ganz gut, bevor das schreiben dieses Codes.Gibt es keine solche Sache wie eine "onscreen" framebuffer-Objekt. Alle benutzerdefinierten FBOs sind per definition off-screen.
Sollten Sie nicht über dieses
viewFramebuffer
FBO überhaupt. Stattdessen sollten Sie ziehen, um Ihre textur, verwenden Sie dann die textur zu zeichnen, um den Standard-framebuffer.Gegeben, dass Sie immer eine
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES
Sie zumindest ein problem mit der Erstellung des offscreen-framebuffer. Betrachten Sie Ihren code nirgends sehe ich die Schaffung einer Farbe renderbuffer für das offscreen-framebuffer (bei der Wiedergabe auf einem CAEAGLLayer, die Ebene selbst schafft die Farbe renderbuffer).Ich glaube, dass müssen Sie etwas wie das folgende in deiner offscreen framebuffer erstellen code (Sie müssen die
OES
- suffix, um eine oder mehrere Funktionen hier, weil diese von einer OpenGL-ES-2.0-Anwendung):