Ich entwickle derzeit ein kleines OpenGL-Spiel für die Android-Plattform und frage mich, ob es eine einfache Möglichkeit gibt, Text über dem gerenderten Frame zu rendern (wie ein HUD mit der Punktzahl des Spielers usw.). Der Text müsste auch eine benutzerdefinierte Schriftart verwenden.
Ich habe ein Beispiel mit einer Ansicht als Overlay gesehen, weiß aber nicht, ob ich das tun möchte, da ich das Spiel möglicherweise später auf andere Plattformen portieren möchte.
Irgendwelche Ideen?
android
opengl-es
text-rendering
wackelte
quelle
quelle
Antworten:
Das Android SDK bietet keine einfache Möglichkeit, Text in OpenGL-Ansichten zu zeichnen. Sie haben folgende Möglichkeiten.
quelle
Das Rendern von Text in eine Textur ist einfacher als in der Sprite Text-Demo. Die Grundidee besteht darin, die Canvas-Klasse zum Rendern in eine Bitmap zu verwenden und die Bitmap dann an eine OpenGL-Textur zu übergeben:
quelle
Ich habe ein Tutorial geschrieben , das die Antwort von JVitela erweitert . Grundsätzlich wird dieselbe Idee verwendet, aber anstatt jede Zeichenfolge in eine Textur zu rendern, werden alle Zeichen aus einer Schriftartdatei in eine Textur gerendert, um eine vollständige dynamische Textwiedergabe ohne weitere Verlangsamungen zu ermöglichen (sobald die Initialisierung abgeschlossen ist). .
Der Hauptvorteil meiner Methode im Vergleich zu den verschiedenen Generatoren für Schriftatlas besteht darin, dass Sie kleine Schriftdateien (.ttf .otf) mit Ihrem Projekt versenden können, anstatt große Bitmaps für jede Schriftvariante und -größe liefern zu müssen. Es kann mit nur einer Schriftdatei Schriftarten in perfekter Qualität in jeder Auflösung erzeugen :)
Das Tutorial enthält vollständigen Code, der in jedem Projekt verwendet werden kann :)
quelle
Nach diesem Link:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Sie können jede Ansicht in eine Bitmap rendern . Es lohnt sich wahrscheinlich anzunehmen, dass Sie eine Ansicht nach Bedarf gestalten können (einschließlich Text, Bilder usw.) und sie dann in eine Bitmap rendern können.
Wenn Sie den obigen JVitela-Code verwenden , sollten Sie diese Bitmap als OpenGL-Textur verwenden können.
quelle
Schauen Sie sich CBFG und den Android-Port des Lade- / Rendering-Codes an. Sie sollten in der Lage sein, den Code in Ihr Projekt einzufügen und ihn sofort zu verwenden.
CBFG - http://www.codehead.co.uk/cbfg
Android Loader - http://www.codehead.co.uk/cbfg/TexFont.java
quelle
Ich habe mir das Sprite-Textbeispiel angesehen und es sieht für eine solche Aufgabe furchtbar kompliziert aus. Ich habe überlegt, auch eine Textur zu rendern, aber ich mache mir Sorgen über den Leistungseinbruch, der dazu führen könnte. Möglicherweise muss ich stattdessen nur eine Ansicht wählen und mir Gedanken über die Portierung machen, wenn es Zeit ist, diese Brücke zu überqueren :)
quelle
Schauen Sie sich das Beispiel "Sprite Text" in den GLSurfaceView-Beispielen an .
quelle
IMHO gibt es drei Gründe, OpenGL ES in einem Spiel zu verwenden:
Das Zeichnen von Text ist im Spieldesign immer ein Problem, da Sie Dinge zeichnen, sodass Sie nicht das Erscheinungsbild einer allgemeinen Aktivität mit Widgets usw. haben können.
Sie können ein Framework verwenden, um Bitmap-Schriftarten aus TrueType-Schriftarten zu generieren und zu rendern. Alle Frameworks, die ich gesehen habe, funktionieren auf die gleiche Weise: Generieren Sie die Scheitelpunkt- und Texturkoordinaten für den Text in der Zeichenzeit. Dies ist nicht die effizienteste Verwendung von OpenGL.
Der beste Weg ist, Remote-Puffer (Vertex Buffer Objects - VBOs) für die Vertices und Texturen zu Beginn des Codes zuzuweisen, um die verzögerten Speicherübertragungsvorgänge in der Zeichenzeit zu vermeiden.
Denken Sie daran, dass Spieler keinen Text lesen möchten, sodass Sie keinen langen, dynamisch generierten Text schreiben. Für Beschriftungen können Sie statische Texturen verwenden, wobei dynamischer Text für Zeit und Punktzahl verbleibt. Beide sind numerisch und haben eine Länge von wenigen Zeichen.
Meine Lösung ist also einfach:
Zeichenvorgänge sind schnell, wenn Sie statische Remote-Puffer verwenden.
Ich erstelle eine XML-Datei mit Bildschirmpositionen (basierend auf dem diagonalen Prozentsatz des Bildschirms) und Texturen (statisch und Zeichen) und lade diese XML vor dem Rendern.
Um eine hohe FPS-Rate zu erzielen, sollten Sie vermeiden, beim Zeichnen VBOs zu generieren.
quelle
Wenn Sie darauf bestehen, GL zu verwenden, können Sie den Text in Texturen rendern. Angenommen, der größte Teil des HUD ist relativ statisch, sollten Sie die Texturen nicht zu oft in den Texturspeicher laden müssen.
quelle
Schauen Sie sich
CBFG
den Android-Port des Lade- / Rendering-Codes an. Sie sollten in der Lage sein, den Code in Ihr Projekt einzufügen und ihn sofort zu verwenden.CBFG
Android Loader
Ich habe Probleme mit dieser Implementierung. Es wird nur ein Zeichen angezeigt, wenn ich versuche, die Größe der Bitmap der Schriftart zu ändern (ich benötige spezielle Buchstaben). Die gesamte Zeichnung schlägt fehl :(
quelle
Ich habe ein paar Stunden danach gesucht, dies war der erste Artikel, auf den ich gestoßen bin, und obwohl er die beste Antwort hat, sind die beliebtesten Antworten meiner Meinung nach falsch. Sicher für das, was ich brauchte. Die Antworten von weichsel und shakazed waren direkt auf dem Knopf, aber in den Artikeln etwas verdeckt. Um Sie direkt zum Projekt zu bringen. Hier: Erstellen Sie einfach ein neues Android-Projekt basierend auf dem vorhandenen Beispiel. Wählen Sie ApiDemos:
Schauen Sie unter dem Quellordner nach
ApiDemos/src/com/example/android/apis/graphics/spritetext
Und Sie finden alles, was Sie brauchen.
quelle
Für statischen Text :
Für Langtext , der gelegentlich aktualisiert werden muss:
Für eine Nummer (formatiert 00.0):
Aktualisieren Sie in Ihrem onDraw-Ereignis nur die an den Shader gesendete Wertvariable.
Der obige Code funktioniert für einen Texturatlas, bei dem die Zahlen in der 7. Spalte der 2. Zeile des Schriftatlas (Textur) bei 0 beginnen.
Weitere Informationen finden Sie unter https://www.shadertoy.com/view/Xl23Dw (allerdings mit falscher Textur).
quelle
In OpenGL ES 2.0 / 3.0 können Sie auch OGL View und die UI-Elemente von Android kombinieren:
Erstellen Sie das Layout activity_gl.xml:
Verwenden Sie Handler / Looper, um Elemente aus dem Render-Thread zu aktualisieren.
quelle