2011-01-17 3 views
0

Ich versuche Post-Processing (Blur, Bloom, etc.) auf dem iPhone mit OpenGL ES 2.0 zu implementieren. Ich stoße auf einige Probleme. Beim Rendern während meines zweiten Rendering-Schritts zeichne ich einen komplett schwarzen Quad auf den Bildschirm statt der Szene (es scheint, dass die Texturdaten fehlen), also frage ich mich, ob die Ursache ein einzelner FBO ist. Ist es falsch, einen einzigen FBO auf die folgende Weise zu verwenden?iPhone Post-Processing mit einem einzigen FBO mit OpenGL ES 2.0?

Für den ersten Durchgang (regelmäßiger Szene-Rendering),

  • Ich lege eine Textur wie COLOR_ATTACHMENT_0 und auf eine Textur machen. glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texturebuffer, 0)

Für den zweiten Durchgang (post-processing),

  • lege ich die Farbe renderbuffer zu COLOR_ATTACHMENT_0 glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 , GL_RENDERBUFFER, colorRenderbuffer)
  • Verwenden Sie dann die Textur aus dem ersten Durchlauf zum Rendern als Quad auf dem Bildschirm.

Antwort

1

Nein, die FBO-Nutzung ist in Ordnung. Die Ursache ist sehr wahrscheinlich, dass Sie die MIN/MAG-Filter Ihrer Textur (texturebuffer) nicht gesetzt haben, nach der Bindung setzen Sie GL_MIN_FILTER und GL_MAG_FILTER mit GLTEXParameter auf GL_NEAREST oder GL_LINEAR, und Ihre Textur sollte funktionieren.

+0

Danke für Ihre Antwort. Gibt es eine Ressource, auf die Sie mich hinweisen könnten, die eine solche Verwendung bestätigen würde? (Nicht, dass ich dir nicht glaube, aber es wäre wahrscheinlich eine ausgezeichnete Referenz.) Auch habe ich bereits den MIN/MAG-Filter eingestellt, also muss es etwas anderes sein. Gibt es noch andere typische Fallstricke? – Jing

+0

Wie unten erwähnt, war das Problem ähnlich .. meine Textur wurde nicht auf eine Stärke von 2 Größe. Ihre Antwort hat mich an der richtigen Stelle suchen, danke. – Jing

1

Wie Matias sagt, sieht Ihr Design gut aus. Ich habe etwas ähnliches selbst gemacht und hatte es gut funktionieren.

Ich schrieb eine Beispielanwendung, die Shader zum Verarbeiten von Kamerabildern verwendet, die here heruntergeladen werden können, aber das glReadPixels() verwendet, um Bildschirmwerte in eine Verarbeitungsroutine zu ziehen, anstatt das Ergebnis direkt einer Textur auf dem Bildschirm zuzuordnen. Sie können es möglicherweise ändern, um dies zu tun.

Sonst habe ich eine komplexere Shader-Beispielanwendung here gemacht, die in einem Teil eine Szene in eine Cube-gemappte Textur rendert und dann diese Textur in eine zweite Verarbeitungsstufe einspeist. Dies sollte das Rendering und die Verwendung einer Textur mit OpenGL ES 2.0 Shadern veranschaulichen.

Vielleicht könnten diese Aufschluss darüber geben, wo Ihre Implementierung fehlschlägt.

+0

Das Problem war, dass meine Textur auf 320x480 statt einer Potenz von 2 (512x512) skaliert wurde. Danke, der Code war sehr hilfreich. – Jing