Ich implementiere eine GUI, die auf OpenGL basiert. Ich kam zu dem Problem, dass jede GUI haben wird - Text-Rendering. Ich kenne mehrere Methoden, um Text in OpenGL zu rendern, aber ich frage mich, welche davon am besten für eine GUI geeignet wäre.Wie funktioniert OpenGL Live-Text-Rendering für eine GUI?
Im Allgemeinen in einer GUI haben wir zwei Arten von Text - statisch und live. Statisch ist einfach genug - wir können ein TTF zu einer Textur rendern und es vergessen. Es ist der "Live" -Text, der mich mehr stört - stell dir eine Konsole oder einen Live-Chat in einem Multiplayer-Spiel vor.
Ich dachte an mehrere Möglichkeiten:
- keine besonderen Fälle - machen und eine Textur jedes Mal, wenn die Textänderungen laden, nur im Auge behalten, es rerender wenn tatsächlich neuer Text erscheint, und zu versuchen, das spalten größerer Text in kleine Teile (wie pro Chatlinie). Das würde uns aber immer noch in Fällen hängen lassen, in denen sich eine Kerblinie ständig ändert, oder in einem Intro-Text, der "pro Charakter" rendert (Schreibmaschinen-Stil in einigen Science-Fiction-Spielen)
- Quad-per-Zeichen - das Auch scheint eine beliebte Lösung zu sein, Sie bereiten eine Textur mit der ASCII-Tabelle vor und rendern ein texturiertes Quad-Zeichen. Ich habe jedoch ernsthafte Zweifel an der Effizienz einer solchen Lösung. Tipps, wie man das schneller macht, wären auch willkommen.
- Hybridlösungen - aber ich habe keine Ahnung, wie zu implementieren, dass sauber
Die Frage ist daher - wie Text in OpenGL effizienter zu machen?
Wenn das hilft, ich kodiere in STL/Boost-schwere C++ und mit dem Ziel GForce 6 und später Grafikkarten.
große Texturen mit allen möglichen Glyphen auf nicht bauen Sie. Während es für westliche Schriften einfach und "vernünftig" ist, erkennen Sie schnell, wenn Sie versuchen, Ihre Anwendung zu internationalisieren, dass dieser Ansatz mit östlichen Schriftarten nicht nachhaltig ist. Die einzige skalierbare Lösung besteht darin, den dynamischen Text bei Bedarf zu generieren. –
Wenn Sie versuchen, einzelne Glyphen selbst zu rendern, ignorieren Sie alles, was das Betriebssystem über Unterschneidung, Akzentzeichen und Kombinieren von Zeichen, Rechts-nach-Links-Skripten und ein paar andere Macken des Typlayouts weiß, die ich gerade vergesse . Es ist wahrscheinlich in Ordnung, ein Textblatt mit 0-9a-zA-Z mit Interpunktion zu haben, um einige wirklich häufige Fälle abzudecken, aber meistens bekommt man einen schöneren Typ, wenn man den Font-Renderer nach der ganzen Zeile oder dem ganzen Absatz fragt. – codewarrior