OpenGL als 2D Framebuffer
« | 10 Dec 2022 | »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.