Sergiy Krutykov

Die Methode Render-to-Texture, die bereits in dem Unterabschnitt Minispiel erläutert wurde, ermöglicht viele 2D Textur-Effekte, die eine OpenGL-Applikation verschönern können. Die Idee ist, dass man die ganze Szene nicht direkt auf dem Framebuffer rendert, der mit dem Bildschirm verknüpft ist (Screen-Framebuffer), sondern zuerst zu einer Textur, dann einige Effekte auf dieser Textur anwendet und erst diese Textur anzeigt. Mit dieser Methode lassen sich unter anderem die folgenden Effekte erzeugen:

Links ist ein Effekt des krummen Spiegels, in der Mitte der Effekt des Schwindelanfalls, und über der Szene rechts laufen Wasserwellen. Natürlich können diese Effekte auch animiert werden und diese Bilder sind nur Screenshots von den laufenden Animationen.

Offensichtlich machen diese Effekte nur dann Sinn, wenn man schafft, das Kamerabild als Textur in OpenGL zu bekommen.

Schematisch sieht der Vorgang folgendermaßen aus:

Mir R2T wird dabei "Render-to-Texture" abgekürzt. Besonderes zu beachten ist der Pfeil, der von "2D-Effekte anwenden" wieder auf "die gerenderte Textur binden" zurück zeigt. Er symbolisiert, dass man die Effekte mehrmals pro Durchlauf anwenden kann. Somit lassen sich die Effekte auch miteinander kombinieren. Dies wird vor allem bei dem bekannten Effekt "Blurring" verwendet, welches in der folgenden Abbildung dargestellt ist:

Das Ziel des Blurrings ist es, in jeden Pixel die Farbe ihn umgebender Pixels einfließen zu lassen, damit die Farben verwischt werden. Da alle Pixels einzeln betrachtet werden müssen, benötigt dieser Vorgang Parallelität, weshalb OpenGL ES 2.0 dafür gut geeignet ist. Sehr großen Performance-Gewinn bringt die Aufspaltung des Prozesses in 2 Unterprozesse: horizontales Blurring (nur die Pixels links und rechts von dem betroffenen Pixel werden betrachtet) und vertikales Blurring (entsprechend nur oben und unten stehende Pixels werden betrachtet). Wenn man diese Effekte kombiniert, dann ergibt sich das Ergebnis wie oben.

Je mehr man das Blurring hintereinander anwendet, desto verschwommener wirkt die Szene. Allerdings ist dieser Prozess auch mit der Aufspaltung in die vertikale und horizontale Komponente sehr aufwendig, so dass er sich so, in dieser Form auf einem Kleingerät kaum realisieren lässt. Als Abhilfe kann man an dieser Stelle einen Trick benutzen. Man kann die Auflösung heruntersetzen und dann das Blurring anwenden. Erstens gibt es dann viel weniger Pixels und der Prozess läuft deshalb schneller und außerdem stellt sich heraus, dass bei niedrigeren Auflösungen die Szene viel schneller verschwommen wird, so dass man doppelten Vorteil dabei hat. In der folgenden Abbildung ist der Blurring-Effekt bei einer relativ niedrigen Auflösung zu sehen, bei welchem nur die nächsten Nachbarn der Pixels benutzt werden (also eigentlich sehr schwaches Blurring, bei welchem in einer normalen Auflösung kaum Unterschied zum Original festzustellen wäre):

Links ist die Szene (zum Vergleich) in der normalen Auflösung, rechts in etwas niedrigeren und rechts ist die Szene mit dem Blurring-Effekt, angewandt auf die Szene in der Mitte. Dieses Heruntersetzten der Auflösung kann man dadurch erzwingen, dass man einfach kleineren Render-to-Texture-Framebuffer (mit kleinerem ViewPort) verwendet aber den normalen Screen-Framebuffer: Dadurch wird am Ende des Vorgangs die kleinere Textur auf einen größeren Bereich aufgezogen.

Die Textur mit dem Kamerabild kann nicht nur für Render-to-Texture verwendet werden, sondern auch ganz normal zum Texturieren der Objekte. Dies ermöglicht einige spiegelnde oder durchsichtige Stoffe zu imitieren. In der folgenden Abbildung ist ein Tresor dargestellt, der auf diese Weise aus zwei etwas unterschiedlichen Arten texturiert ist:

Links scheint er aus Glas zu bestehen und rechts wirkt er metallisch.


Page last modified on March 21, 2011, at 11:24 PM