2010-11-24 2 views
2

Lets sagen, ich habe eine Anwendung (die Details der Anwendung sollten irrelevent sein, um das Problem zu lösen). Anstatt auf den Bildschirm zu rendern, bin ich irgendwie in der Lage, die Anwendung zu zwingen, zu einem Framebuffer-Objekt zu rendern, anstatt auf den Bildschirm zu rendern (mit glew zu tun oder einen Anruf in einer DLL abzufangen).Anwenden eines Shaders auf Framebuffer-Objekt, um Fisheye-Effekt zu bekommen

Sobald die Anwendung ihren Inhalt auf den FBO übertragen hat, ist es möglich, einen Shader auf den Inhalt der FB anzuwenden? Mein Wissen ist hier begrenzt, daher sind nach dem, was ich in diesem Stadium verstehe, alle Informationen über Scheitelpunkte nicht mehr verfügbar und alle notwendigen Tests wurden angewendet, so dass im Puffer nur Pixeldaten verbleiben. Ist das richtig?

Wenn es möglich ist, einen Shader auf den FBO anzuwenden, ist es möglich, einen Fischaugeneffekt zu bekommen? (wie zum Beispiel: http://idea.hosting.lv/a/gfx/quakeshots.html)

Die Technik in der oben genannten Linke besteht darin, 6 verschiedene Ansichtsfenster zu erstellen und jedes Ansichtsfenster zu einem Cubemap Gesicht und dann die Textur auf ein Netz anwenden.

Dank

Antwort

4

Ein Framebuffer-Objekt kapselt mehrere andere Puffer ein, insbesondere diejenigen, die implizit durch die Fragmentposition indiziert werden. So kann ein einzelnes Framebuffer-Objekt einen Farbpuffer, einen Tiefenpuffer, einen Schablonenpuffer und eine Menge anderer zusammenbündeln. Die einzelnen Puffer werden als Renderpuffer bezeichnet.

Sie haben Recht - da ist keine Geometrie drin. Für das Zurücklesen der Szene erhalten Sie nur die letzten Fragmentwerte. Wenn Sie eine existierende App entführen, ist das wahrscheinlich ein 2-Pixel-Bild des Rahmens und einige andere Dinge, die Ihnen egal sind.

Wenn Ihre GPU eine Render-to-Texture-Unterstützung hat (ursprünglich eine Erweiterung für OpenGL 1.3, aber Sie würden heutzutage kaum noch eine GPU finden, sogar in Mobiltelefonen), dann können Sie eine Textur als Renderpuffer verknüpfen innerhalb eines Framebuffers. Der Rendering-Code ist also genau so, wie er normalerweise wäre, aber er schreibt die Ergebnisse in eine Textur, die Sie dann als Quelle für das Zeichnen verwenden können.

Fragment-Shader können programmgesteuert entscheiden, welche Position einer Textur-Map abgetastet werden soll, um ihre Ausgabe zu erstellen. Sie können also einen Fragment-Shader schreiben, der ein Fisheye-Objektiv anwendet, obwohl Sie offensichtlich auf das Gesichtsfeld beschränkt sind, das in der ursprünglichen Textur wiedergegeben wird. Das wäre wahrscheinlich das, was du in deinem Quake-Beispiel bekommen würdest, wenn du nur eine der Seiten des Würfels anstatt sechs zur Verfügung hättest.

Zusammenfassend: Die Antwort ist "Ja" auf alle Ihre Fragen. Es gibt eine kurze Einführung in Framebuffer-Objekte here.

+0

Ok, nachdem Sie ein renderbuffer-Objekt erstellt haben, erfasste die gerenderte Ausgabe der Anwendung, die als Textur verwendet werden soll, was ist der Zweck des Fragment-Shaders? Sie haben erwähnt, dass der Fragment-Shader programmgesteuert entscheiden kann, welche Position abgetastet werden soll. Kannst du bitte erklären, was du damit im Zusammenhang mit diesem Problem meintest? – Adham

+0

Was Sie tun könnten, ist ein einzelnes Quad zeichnen, um die Fischaugenlinse zu enthalten.Jedes Fragment erhält eine Eingabe (x, y), aber anstatt nur das Pixel um (x, y) im Quellbild nachzuschlagen und das als Ausgabefarbe zu setzen, wird es eine Berechnung durchführen, um herauszufinden, wo die Eingabefarbe von, um das Bild Fisheye (wahrscheinlich so etwas wie Umschalten auf Polarkoordinaten und werfen einen Kosinus auf Distanz?) - genau wie Photoshop würde. Dann reichen Sie nur ein Quad ein und erhalten ein pixelgenaues Fischauge. – Tommy

2

Schauen Sie sich hier für einige relevante Informationen:

http://www.opengl.org/wiki/Framebuffer_Object

Die kurze, einfache Erklärung ist, dass ein FBO das Äquivalent eines Software-Frame-Buffer 3D ist. Sie haben direkten Zugriff auf einzelne Pixel, anstatt eine Textur ändern und hochladen zu müssen. Sie können Shader auf einen FBO zeigen lassen. Der obige Link gibt einen Überblick über das Verfahren.

Verwandte Themen