OpenGL als 2D Framebuffer

Wie bekomme ich meine flachen Framebuffer jetzt auf’s Android Smartphone?

Antwort: Über OpenGL Texturen


Der generische Framebuffer ist “die” Lösung im GATE Framework, um Bilder plattformunabhängig überall anzeigen zu können. Dass das unter Windows über die WinAPI und auf Linux über die Xlib läuft, ist nichts besonderes.

Selbst für DOS oder EFI, wo das Ganze direkt in die Video-Hardware geschrieben wird, gibt es eine Implementierung.

Nur Android und UWP/DirectX Apps fehlen mir noch.

Doch an Android wird bereits gearbeitet.

Idee

Wann immer der Framebuffer ein neues Bild erhält, wandelt er dieses in OpenGL Texturen um und legt diese auf rechteckige GL Objekte, die im Vollbild angezeigt wird.

Und tatsächlich funktioniert dieser Ansatz. Ich habe per glOrtho() eine 2D Umgebung aufgesetzt und jedes rechteckige Teilbild wird als TRIANGLE_FAN an die richtige Stelle des Bildschirms gepackt.

Ein bisschen Tricksen musste ich bei der Ereignisverwaltung, denn hier hatte ich für OpenGL eine gekapselte Eventloop vorgesehen, doch bei den Framebuffers werden Ereignisse ge-poll-t und man muss die Eventloop selbst umsetzten.
Doch das lässt sich über Threads und Queues lösen.

Fazit

Die Grafik ist also mit ein bisschen Kopfrechnen machbar.

Zugegeben, es nicht sehr effizient für einen OpenGL Host, wenn ich immer alles per CPU in einen Framebuffer zeichne, diesen dann zerteile und in Texturen umwandle und diese dann auf Flächen projiziert werden, aber es funktioniert.

Und hier geht es um best mögliche Kompatibilität und nicht um höchste Performance.

Mit diesem Ansatz ließe sich auch einige alte (gut designe-te) DOS Spiele für Android oder andere OpenGL-Systeme neu kompilieren, wenn man den Grafikspeicher als virtuellen Framebuffer ansieht und ähnlich auf eine neue Oberfläche abbildet.
Wäre mal interessant um wie viel besser das ist, als alles in einem Emulator laufen zu lassen.