2012-03-28 18 views
3

Ich bemerkte, dass, wenn ich meine Tiefenpuffer vor dem Farbpuffer zu binden, die Anwendung wie vorgesehen funktioniert:OpenGL ES 2.0 Buffer-Setup

glGenRenderbuffers(1, &_depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh); 
glGenRenderbuffers(1, &_renderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; 

jedoch die Bindung des Tiefenpuffer nichts danach verursacht zu machen, auch meine glClearColor Einstellung wird ignoriert:

glGenRenderbuffers(1, &_renderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; 
glGenRenderbuffers(1, &_depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh); 

ich bekommen habe, durch die Erforschung der einzelnen Komponenten gründlich einen Teil der Strömung, wie OpenGL eS 2.0 Arbeiten zu verstehen, aber dies scheint, als ob es das einzige, was das ist, jeder macht nur in ihren Tutorials/Bücher, erklärt aber nicht warum. Irgendwelche Ideen? Ist das überhaupt ein Problem, oder möglicherweise etwas falsch im Rest meines Setups? (Wenn ja, werde ich umfassen den gesamten Code)

EDIT

@cli_hlt - der Tiefenpuffer bereits hinzugefügt, um die Framebuffer wird:

glGenFramebuffers(1, &_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthbuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer); 

EDIT

Tiefe gebunden vorher:

enter image description here enter image description here

Tiefe gebunden nach:

enter image description here

+0

Überprüfen Sie die Antwort auf diese Frage: http://stackoverflow.com/questions/4361516/request-a-depthbuffer-in-opengl-es-for-iphone - es scheint, dass Sie fehlen, um die Puffergröße und Anhängen abzufragen es zum Framebuffer. –

+1

Das kommt später; Wenn es nicht dort wäre, würde ich keinen Gebrauch aus dem Tiefenpuffer machen, unabhängig von meiner Frage nach der Reihenfolge der Bestellung. –

+0

Ok. Ist _sw und _sh korrekt? Ich frage wie in der Antwort oben geschrieben, das Antwort-Plakat tat es genau in der zweiten Art und als die Antwort angenommen wurde, nahm ich an, dass es funktionierte. –

Antwort

3

ich sein kann völlig falsch-ich bin gerade auf diesem Zeug einen Griff bekommen mich aber, wie ich es verstehe, glBind nur OpenGL sagen Befehle, die renderbuffer/texture/was auch immer für nachfolgende Funktionen verwendet werden soll. Es ist ein seltsames Modell, wenn Sie an objektorientierte Programmierung gewöhnt sind. Im Setup-Code müssen Sie den von Ihnen erstellten Puffer an den GL_RENDERBUFFER- "Slot" binden, damit der nächste glRenderbufferStorage() - oder - [EAGLContext renderbufferStorage: from Drawable:] Aufruf weiß, welcher Puffer verwendet werden soll. Ich denke, das Problem besteht nur darin, dass Sie den aktiven GL_RENDERBUFFER nicht vor dem Aufruf an Ihren Farbpuffer binden - [EAGLContext presentRenderBuffer:], so dass Sie tatsächlich den Tiefenpuffer anzeigen. Hinzufügen

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 

vor dem presentRenderBuffer: Anruf sollte das beheben. …Ich denke.

+0

Ich akzeptiere diese Antwort vorübergehend, obwohl ich nach einer definitiveren Antwort von jemandem suche, der ein Experte für OpenGL ES 2.0 ist und genau erklären kann, warum dies so funktioniert. –

+0

Bitte lassen Sie mich wissen, wenn das Ihr Problem nicht wirklich behebt, damit ich herausfinden kann, was ich über OpenGL nicht verstehe. Vielen Dank! – davehayden

+0

Es funktioniert, und das Konzept hinter Ihrer Antwort scheint richtig zu sein. In meinen Augen ist der Parameter 'internalformat' jedoch immer noch eine Blackbox. Was in 'glRenderbufferStorage (...)' geschieht, macht einen Unterschied, welcher Puffer für nachfolgende Aufrufe an den Renderpuffer gebunden ist. Wenn die Reihenfolge wichtig ist, wird alles, was der Tiefenpuffer vollbringt, mit 'glBindRenderbuffer (GL_RENDERBUFFER, _renderbuffer); überschrieben, was mich dazu bringt zu fragen, ob der Tiefenpuffer irgendetwas tut? Es sieht nicht so aus ... seit dem Auslassen dieses Codeabschnitts ändert sich ** nichts ** in meiner App. lol –

0

Man würde denken, dass man zum Rendern einfach den benötigten Framebuffer an GL_FRAMEBUFFER binden muss - da der Framebuffer selbst sowohl an die Farb- als auch an die Tiefen-Renderpuffer gebunden ist.

Auf iOS/OpenGL ES 2.0 müssen Sie jedoch auch die Farbe renderbuffer an GL_RENDERBUFFER binden, sonst wird nichts gezeichnet.

deshalb nach Unterstützung für die Tiefe renderbuffer Umschichtungen vorzunehmen, stellen Sie sicher, Sie dies tun, durch den Aufruf:

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); 

Warum ist das? Nun, unter iOS sind wir es gewohnt, OpenGL ES mit einem EAGLContext auf einen CAEAGLLayer zu rendern. Nach dem Rendern mit OGL-Aufrufen zum Rendern in einen Framebuffer rufen wir die Methode presentRenderbuffer: von EAGLContext auf, um dies tatsächlich auf der Zeichenfläche anzuzeigen.

Vom EAGLContext docs:

- (BOOL)presentRenderbuffer:(NSUInteger)target

Zeigt ein Inhalt auf dem Bildschirm des renderbuffer.

Die renderbuffer angezeigt werden, müssen Speicher mit dem renderbufferStorage zugeordnet wurden: fromDrawable: Methode

Sie können überprüfen, dies ist durch den Anruf zu glBindRenderbuffer unmittelbar vor Ihren Anruf [context presentRenderbuffer:GL_RENDERBUFFER] platzieren - die Bindung wirkt sich nur, dass Aufruf, nicht die vorhergehenden Interaktionen mit OpenGL.