Bevorzugte Methode zum Rendern von Text in OpenGL [closed]

17

Ich bin dabei, Computergrafik für ein Universitätsprojekt noch einmal in die Hand zu nehmen. Bei einem früheren Projekt habe ich eine Bibliothek namens FTGL verwendet , die mich nicht ganz zufrieden stellte, da sie sich ziemlich schwer anfühlte (ich habe viele Rendering-Techniken ausprobiert, Text-Rendering war nicht sehr gut skalierbar ).

Meine Frage ist, gibt es dafür eine gute und effiziente Bibliothek? Wenn nicht, wie könnte man schnell aber gut aussehenden Text implementieren? Einige Verwendungszwecke sind:

  • Schwimmende Objekt- / Zeichenbeschriftungen
  • Dialoge
  • Menüs
  • HUD

BEARBEITEN: Vorzugsweise könnte es auch Schriftarten laden

dukeofgaming
quelle
1
Hierbei handelt es sich um eine "welche Technologie zu verwendende Frage", und sollte daher wohl geschlossen werden.
Laurent Couvidou

Antworten:

4

Ein beliebtes Framework ist die GUI von Crazy Eddie .

Aber während das ansprechend ist, ist es nicht ungewöhnlich, das eigene zu rollen (und es vielleicht zu bereuen, da der Umfang später zunimmt;))

Es ist normal, Ihre Glyphen in Bitmaps zu haben und diese dann mit OpenGL zu zeichnen.

Manchmal wird vorübergehender Text angezeigt, der möglicherweise nur für eine Handvoll Frames angezeigt wird. Es reicht aus, nur GL_QUADS + glVertex zu verwenden. Aber für jede große Textmenge oder für jede lange Sichtbarkeit lohnt es sich, den GL_QUADS in einen VBO zu integrieren - ich habe große Leistungsverbesserungen festgestellt.

Es ist natürlich die Frage, die tatsächlichen Glyphen zu generieren, die Sie benötigen. Es gibt Programme wie bmfont , die Sie dafür verwenden können. Oder Sie benötigen ein etwas komplizierteres Rendering, z. B. Freetype on Demand. Ich habe bmfont sehr gerne mit meinem eigenen Renderer verwendet, es ist sehr einfach abzuleiten.

Wille
quelle
9

Es gibt viele Möglichkeiten - je nachdem, was Sie wollen ... Wie überall sonst gibt es nicht so etwas wie "die beste Lösung". Welche Plattform ist Ihr Ziel? Welche sprache sprichst du Was ist mit der Größenänderung / Drehung von Text - ist das notwendig? Müssen Sie in der Lage sein, TrueTypeFonts zu rendern? Was ist mit Multilanguage / Unicode? Wie möchten Sie Ihren Text speichern (welche Kodierung etc.)?

Ich habe in der Vergangenheit auch FTGL verwendet, sowie reinen Freetype (http://www.freetype.org/ FTGL basiert darauf), verschiedene Arten von Bitmap-Schriften, Outline-Schriften ... Jetzt bin ich meistens bitmap-süchtig Schriften, aber das ist nur meine persönliche Vorliebe. Da ich mich nicht mehr mit verschiedenen Zeichensätzen, Codierungen und Ähnlichem befassen möchte, ist die Lizenzierung für Bitmapfonts auch einfacher und billiger als für TrueTypeFonts. Und es kann auf jeder Plattform verwendet werden, die Bilder laden kann. Ich benutze einfach ein Quad in openGL und ordne einen Teil meiner Textur darauf zu. Die andere Seite ist: Die Schriftgröße wird nur um einen Faktor von +/- 50% geändert. Wenn Sie damit leben können, würde ich vorschlagen, ein Bitmapfont zu verwenden.

Wenn Sie auch mit verschiedenen Kodierungen / Zeichensätzen zu tun haben, sollten Sie eine Möglichkeit finden, TrueTypeFonts zu laden und zu verwenden (wie bei freetype, mit einer anderen Bibliothek oder mit Ihrer eigenen Implementierung) ...

Schauen Sie sich auch nehes verschiedene Tutorials zu diesem Thema an:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Bitmap-Schriftarten

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Gliederungsschriftarten

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Texture Mapped Outline Fonts

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 2D Texture Font

Viel Glück!

Constantin
quelle
+1 Vielen Dank für die wertvollen Informationen zur Leistung. Ich wusste etwas über die Tutorials von NeHe. Ich glaube, ich habe Bitmap-Schriften verwendet ... aber sie waren nicht skalierbar: Ungefähr 60 Beschriftungen schwebten in einer Szene über Kugeln, die durch Linien verbunden waren. (Ich dachte, ich hätte nach einer Möglichkeit
suchen sollen
1
Achtung: Die Tutorials von NeHe beziehen sich auf die alte Pipeline mit festen Funktionen und werden nicht oft aktualisiert. Wenn Sie nach einer modernen OpenGL-Lösung suchen,
lesen
6

Wenn Sie Bitmap-Schriften verwenden möchten, können Sie mit dem Angelcode Bitmap Font Generator nichts falsch machen: http://www.angelcode.com/products/bmfont/

Es konvertiert eine TrueType-Schriftart in eine oder mehrere Texturen (mit schön gepackten Glyphen) und gibt eine kleine Datei mit den UV-Werten und Abständen aus (ich finde, dass die XML-Ausgabe besonders einfach zu verarbeiten ist und die Qualität der Abstandsdaten im Allgemeinen ist sehr gut, auch ohne Kerning

Bluescrn
quelle
1

Ich verwende die Bibliotheken von Sean Barret , um TrueType-Glyphen unter OpenGL (stb_image, stb_truetype) zu rendern.

Das Recast / Detour-Projekt verwendet diese Bibliotheken, um eine Benutzeroberfläche ( IMUI ) zu erstellen.

Marco Schmidt
quelle
0

Betrachten Sie QML . Es ist eine voll funktionsfähige UI-Bibliothek mit einer einfach zu verwendenden Syntax. Sein Funktionsumfang ist meiner Erfahrung nach deutlich besser als der von CEGUI. Außerdem bietet es eine bessere Dokumentation, Unterstützung und Community, da Desktopanwendungen das Hauptziel sind und die Fähigkeit, Offscreen zu rendern, nur eine Art Bonus ist.

Vorteile:

  • Es verwendet OpenGL im Back-End für das gesamte Rendering
  • Es kann alle für das Hostsystem verfügbaren Schriftarten laden und zusätzliche Schriftarten analysieren, die Sie als Ressourcen einschließen
  • Für eine effiziente und qualitativ hochwertige Ausgabe wird das Text-Rendering mit vorzeichenbehafteten Distanzfeldern verwendet
  • Es kann direkt in eine OpenGL-Textur gerendert werden, sodass Sie die Ergebnisse problemlos in Ihre Spielumgebung einfügen können
  • Qt hat viele Sprachbindungen

Nachteile:

  • Qt ist ein großer Rahmen
  • Wenn Sie QML in Direct3D- oder Vulkan-Projekten verwenden möchten, müssen Sie durch die Rahmen springen, um die GL-Textur in die entsprechende API zu laden (oder darauf warten, dass jemand native D3D / Vulkan-Renderer für QML schreibt).
  • Es gibt immer noch einige kleinere Macken in QML, bei denen versucht wird, ein systemeigenes Steuerelement zu verwenden, auch wenn Sie auf einer Offscreen-Oberfläche rendern, z. B. wenn Sie versuchen, ein Dropdown-Menü für ein Listenelement zu öffnen.
Jherico
quelle