Registriert: Sa Jul 10, 2010 16:22 Beiträge: 16
Programmiersprache: C++
Hallo, ich stehe vor dem Problem in mein Projekt eine vernünftige Font-Unterstützung einzubauen. Und zwar habe ich verschiedene Labels die jeweils eine beliebige Font und Fontgröße haben können sollen. Das Problem mit wglUseFontBitmap ist, dass ich dann wohl für jedes Label sein eigens Fontobjekt erzeugen müsst, was nicht sehr sinnvoll klingt. Vor allem wenn man Unicode nutzen möchte. Hat jemand eine Idee wie man das ganze vernünftig lösen könnte. Am liebsten hätte ich eine Liste aller Systemfonts und würde dann die benötigten Fonts erzeugen. Der Funktion "printtext" würde man dann Schriftgröße, Font, den Text usw. übergeben und bekäme dann die gewünschte Ausgabe. Wäre dies evtl. mit FreeType zu verwirklichen wenn es mit wglUseFontBitmap nicht geht?
Bei Bitmap Fonts hast du generell das Problem, dass du eigentlich nur eine Textur streckst, und dadurch den eigentlich Fontsupport gar nicht nutzen kannst. Mit ner richtigen Font (also dem Erstellen eines Font-Objectes aus einer ttf Datei zb) hast du da mehr möglichkeiten. Ich erinnere mich noch, dass das in Delphi relativ angenehm ging. In Java zb. ist es einfach nur ätzend.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Du könntest mit SDL_ttf arbeiten. Das erzeugt dir für einen bestimmten Text eine SDL-Surface die du dann an OpenGL als Textur übergeben kannst (mit etwas umwandlung evtl.). Das kannst du entweder nutzen, um eine Texturfonttextur zu befüllen (auch mit Zeichen unterschiedlicher Schriftarten, musst dir dann ne gescheite Verwaltung ausdenken) oder du renderst für jedes Label den Text bei Änderung neu (und erzeugst damit auch für jedes Label eine eigene Textur). Letzteres ist Platz- und Geschwindigkeitsineffizienter, aber um längen einfacher zu implementieren.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Jul 10, 2010 16:22 Beiträge: 16
Programmiersprache: C++
Allerdings brauche ich auch die Möglichkeit Vektor-Fonts zu rendern, das kann die SDL wohl nicht. Ich würde ja gerne FTGL mit FreeType 2 verwenden, bekomme leider immer Linker Fehler. Z.B.:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual class FTPoint __thiscall FTFont::Render(char const *,int,class FTPoint,class FTPoint,int)" (__imp_?Render@FTFont@@UAE?AVFTPoint@@PBDHV2@1H@Z) referenced in function "public: __thiscall MainWindow::MainWindow(struct HINSTANCE__ *)" (??0MainWindow@@QAE@PAUHINSTANCE__@@@Z).
oder
error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall FTTextureFont::~FTTextureFont(void)" (__imp_??1FTTextureFont@@UAE@XZ) referenced in function "public: __thiscall MainWindow::MainWindow(struct HINSTANCE__ *)" (??0MainWindow@@QAE@PAUHINSTANCE__@@@Z).
Hat schonmal jemand FTGL verwendet? Muss evtl. doch noch eine Lib eingebunden werden. Und wie schaut es eigentlich aus direkt FreeType2 zu verwenden? In der Lesson 43 von NeHe wird das ja auch mit BitmapFonts gemacht. Ist das so viel schwieriger mit Vektor-Fonts?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wofür brauchst du denn direktes Vektor-Font-Rendering? Willst du die Geometrie der Buchstaben Extrudieren oder sowas? Generell reicht es, die gerenderten Zeichen als Textur irgendwo draufzuklatschen. Und SDL kommt mit TTF & Co (<- Vektorfonts) wunderbar klar … Deshalb heißt es SDL_ttf
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
In my glVectorGraphics project you can find a way to render vector fonts.
It does not directly render ttf fonts you have to convert them first to outlines. A tool is provided. It should also be possible to create outlines with freetype2, but i have not tried that (yet).
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich sage es ja nur ungern. Aber irgendwie klingen deine Anforderungen wirr. Zu erst wglUseFontBitmap dann direkte Vektorfonts. Passt für meine Geschmack nicht ganz zusammen. Mit wglUseFontBitmap kannst du dich allerdings von Unicode verabschieden. Das einzige was du damit erreichen könntest wären die normalen Codepages. Aber echtes Unicode geht meines Wissens nach bereits technisch damit nicht.
Ich wüsste auch gerne mal wer das Gerücht in die Welt gesetzt hat, dass eine C konforme Bibliothek mit serienmäßig ausgeliefertem C++ Header nur Delphi Only ist? Dein "Problem" mit glLoadIdentity verstehe ich leider auch nicht. Also mangels Infos was daran das Problem ist.
Zum FreeType Kompilieren kann ich nichts sagen. Weil ich nur die Bibliothek bisher benutzt habe und ich nicht so genau verstanden habe was du willst und wo du Problem hast.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
>> Geht in Richtung OffTopic <<
Also wenn ich das richtig verstehe hat sich der Threadersteller in den Kopf gesetzt Vectorfonts darzustellen, weil ihm andere Methoden nicht zusagen (aus Gründen. Ich denke, die wird er haben), also warum wird jetzt krampfhaft versucht Bibliotheken mit alternativen Methoden an den Threadersteller zu verkaufen? Gut, ich kann mir vorstellen, dass Lossy nicht unbedingt zufrieden damit ist, dass Textsuite relativ leichtfertig beiseite geschoben wurde, aber ich denke es ist richtiger den Weg für Vectorfonts zu erarbeiten, als Alternativen runterzurödeln, wenn der Threadersteller schon ausgiebig nach Vectorfonts fragt. Ich finde das Thema Vectorfonts direkt darzustellen sehr interessant und würde da gerne mehr zu lesen/erfahren. Da fänd ich es schade, wenn dieser Thread beendet wird, weil der Threadersteller mit einer Alternative von seinem eigentlichen Vorhaben abgebracht wurde, oder er gänzlich den Thread fallen lässt, weil er vermutet hier nicht genügend Infos zu seinem eigentlichen Problem zu bekommen.
Ich kann mich daran erinnern, dass Aya sowas mal programmiert hat. Natürlich wird sie hier nicht ihren Sourcecode posten (Wäre ja auch wieder nichts selbstgemacht/gelernt), aber ich denke, dass sie viele Denkanstöße in die richtige Richtung geben kann.
Klingt vielleicht etwas harsch, aber es ist ein Problem, dass ich hier im Forum schon öfters gesehen habe: Person XYZ fragt wie mache ich dies und jenes? Antwort: "Nicht selbst machen und lernen, nein nein! Mach doch lieber hiermit oder damit, hauptsache fertig werden!", Ergebnis: Es wurden bekannte Lösungen beworben, die Lösung gefällt dem Fragesteller nicht unbedingt, weil sie wie übers kniegebrochen ist und mehr wissen als vorher tut er auch nicht. Evtl. Sollte man sich hier angewöhnen zu fragen, ob Alternativen mit anderen Herangehensweisen überhaupt gewünscht sind, oder das Problem tatsächlich und nur so gelöst werden soll. Es gab schon so einige Threads deren Titel und Frage super interessant war, die sich nach 3 Antworten erledigt hatten, weil irgendwelche Bibliotheken vorgeschlagen wurden, die das Problem übernehmen. => Langweilig, ich bin hier um nicht nur etwas zu helfen bei Fragen, sondern um auch bei interessanten Fragen was zu lernen. jedoch habe ich immer häufger das Gefühl, dass hier nur OpenSourceLibs propagiert werden um Fragesteller möglichst schnell abzuschwatzen. (Entschuldigt die Vorwürfe, aber es stört schon ein wenig)
UND GANZ WICHTIG: Ich erwarte keine Rechtfertigung von sonst irgendwem, der sich angesprochen fühlt. Das wäre nähmlich das zweite Problem dieses Forums. Also sorry für OT an der Stelle und zurück an die Arbeit.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Sellmann Joahr. Das ist durchaus Offtopic. Allerdings kannst du doch nicht allen Ernstes erwarten, dass du so ein Post verfasst und dazu keine Kommentare bekommst! Ob du das als Rechtfertigung siehst ist deine Sache.
Zu mindest mir ist es vollkommen egal was Mountainking letzten Endes als Lösung benutzt. Klar, wenn es meine Bibliothek wäre würde mich das freuen. Wenn nicht ist das auch egal, da ich weiß das es nicht eine Lösung für alle Einsatzfälle gibt. Allerdings wird es doch erlaubt sein, dass ich bei dem "glLoadIdentity-Problem" nachfrage was dort gemeint ist. Denn ehrlich gesagt klingt das so als wäre das allseits bekanntes Problem. Nur komisch, dass ich davon noch nichts gehört habe. Und auf der anderen Seite wird es doch auch erlaubt sein, dass Falschaussagen korrigiert werden? Und das hat nichts mit Bewerben, auf Auge drücken oder verhindern von Lernen zu tun. Nur weil du scheinbar jedes kleine Problem selbst gerne bis ins kleinste Detail lösen möchtest heißt es nicht, dass alle Anderen das auch tun möchten. Es gibt genügend Leute die einfach nur etwas einbinden wollen und es benutzen wollen ohne sich in ein Thema bis ins kleinste Detail einarbeiten zu müssen. Es hat durchaus funktionale und sicherheitsrelevante Vorteile sich auf eine fertige Bibliothek zu stützen als halbeingearbeitet sich knietief irgendwo drin zu verkriechen.
Und einer Aussage von dir kann ich auch nicht zustimmen. Also die, dass Mountainking doch ausgiebig nach Vektorfonts gefragt hat. In seinem ersten Thema fragt er nach "Labels" und "wglUseFontBitmap". Und im Dritten scheint FTGL nicht so recht zu funktionieren. Und wie ich in meinem Post mehrfach geschrieben habe fehlen mir persönlich dort einfach ein paar Infos was genau er machen will, damit man man ihm eine sinnvolle Lösung vorschlagen kann. Zu mindest ich traue mich nicht zu behaupten ich wüsste wie die ideale Lösung aussieht. Und häufiger ist es nun mal auch so, dass die ersten Fragen nach einer Problemlösung nicht das eigentliche Problem/Anforderung betreffen sondern nur Probleme des Lösungsversuches sind. Und häufiger ist die erste Idee wie man ein Problem löst auch nicht immer die Sinnvollste. Und das wurde schon in mehr als nur einem Thema gezeigt, dass die erste Lösung bei Weitem nicht immer die Beste war. Die Themengebiete sind teilweise so dermaßen komplex, dass man selbst als jemand der Jahre lange damit arbeitet nicht alle Lösungsmöglichkeiten überblicken kann.
Entsprechen würde ich dich Mountainking bitten ein wenig weiter auszuholen. Also was du in deiner Anwenung genau vor hast?
PS: Sellmann. Wenn du selbst der Meinung bist, dass du tiefer in ein Thema einsteigen musst, dann mach es doch einfach. Allerdings darfst du nicht erwarten, dass es hier (Die Community ist nun mal nicht die Größte) immer jemanden gibt der sich mit so etwas schon intensiv beschäftigt hat und du dann nur noch die zusammengetragenen Links durchlesen musst. Da muss man eventuell auch schon mal etwas Arbeit von sich aus reinstecken. Und nur weil man nicht jedem direkt die Untiefen irgendwelcher System komplett aufs Auge drückt heißt es nicht, dass man Lernen verhindern will. Da etwas anderes zu Behaupten ist schon ziemlich dreist. Nur so am Rande. FreeType2 ist auch nur eine Bibliothek die das Arbeiten mit OpenType oder TrueType Fonts vereinfacht. Wenn du Zeichen gerendert haben willst liegt das fast direkt an dem was SDL_ttf produziert (+ mehr Infos über die Texte). Und nur weil du FreeType2 beherscht heißt es nicht, dass du weißt wie die Fonts funktionieren. Deiner Ansicht nach müsste man (um es richtig zu machen) ja FreeType2 nachprogrammieren.
Registriert: Sa Jul 10, 2010 16:22 Beiträge: 16
Programmiersprache: C++
Sorry, habe mich etwas unpräzise ausgedrückt. Das glUseBitmapFont im ersten Post könnte man auch durch glUseFontOutline ersetzen. Beides erfüllt meine Anforderungen nicht. Mir ging es halt erstmal nur darum überhaupt Text anzuzeigen, solange ich keine anderweitige Lösung habe.
Ich schreibe gerade ein GUI-Framework das zoombar (ZUI) ist und arbeite an einer CAD Anwendung die auf diesem ZUI aufbaut. Für das Framework fehlt mir im Moment allerdings noch die nötige scalierbare Font. Nach Möglichkeit sollte das ganze leicht portierbar sein. Noch ein Grund die WGL-Sache zu vergessen. Schreiben tue ich das ganze in C++.
@Lossy Ex Wenn ich das richtig gelesen habe ist dein Sourcecode auch nicht öffentlich zugänglich. Das ist eigentlich das Hauptargument gegen deine Lib. Außerdem habe ich diesen Tick immer alles selber machen zu müssen. Kennt vielleicht der ein oder andere . Generell möchte ich so wenig Libs wie möglich verwenden wegen evtl. Linzenzproblemen.
Zu dem Problem mit glLoadIdentity(): Da ich verschiedene GUI-Elemente mit glTranslated ausrichte würde mir ein Aufruf von glLoadIdentity dazwischen alles kaputt machen.
Der Tipp mit SDL_ttf war gut muss ich mir aber noch genauer anschauen. Bin mir nicht sicher ob ich dann auch mein Window mit der SDL erzeugen muss, oder ich einfach nur den Fontteil übernehmen kann.
An einem funktionierendem Codebeispiel mit FTGL wäre ich immer noch interessiert. Im Moment habe ich die FreeType2 und FTGL Verzeichnisse zu den Include Pfaden hinzugefügt und include wie in oben genannten Tutorial den FTGL.h Header. Damit sollte das ganze laufen. Eigentlich. Solbald ich also z.B.
Zu dem Problem mit glLoadIdentity(): Da ich verschiedene GUI-Elemente mit glTranslated ausrichte würde mir ein Aufruf von glLoadIdentity dazwischen alles kaputt machen.
Via glPushMatrix und glPopMatrix sollte das kein problem darstellen eigentlich. Und soweit ich weiß ist die TextSuite OpenSource, nur eben in Delphi geschrieben..
Aber da ich auch diesen Tick habe alles selber zu machen, stand ich auch irgendwann mal vor dem Problem der TextAusgabe.. ich hab mich dann dran gesetzt und die TTF dateien selber geparsed und ausgewertet... ist nen Ordentliches Stück arbeit, vorallem bis man erstmal verstanden hat wie genau was zusammen gehört etc.
Dokumentationen gibt es da zwar durchaus, aber die sind sehr Fehlerhaft.. ich habe mir damals beholfen in dem ich bei diversen anderen Tools die ebenfalls TTFs parsen können geschaut habe wie die das machen (z.B. auch Freetype. In deren Sourceode ist so mancher parameter der TTF datei besser erklärt als in jeder Online Doku. Aber sie schreiben auch meist dazu das sie das selbst nur nach langem mailverkehr mit Apple/MS Entwicklern rausgefunden haben).
Aus der TTF datei bekommst du dann am ende wenn du alles richtig machst die Outlines der Buchstaben als Bezier Kurve, also im Prinzip als Vektoren, so wie du es magst.
Der nächste Schritt ist dann das Rastern eben dieser VektorPfade.. das geht im prinzip recht simpel, aber für deinen fall müßtst du das via shader oder Geometrie lösen, denn wenn du das ganze in eine Textur rasterst sind die Vektor-vorteile wieder weg
Es ist aufjedenfall nen gutes Stück arbeit wenn du das machen willst und sicher nichts was man an einem Tag schafft.. ich habe damals als ich mich durch die Dokus gequält hab ein paar Abende dran gesessen.
Wenn dich sowas Interessiert und du ebenfalls den Tick hast, kann ich nur sagen.. mach es einfach Links kann ich dir nur bedingt geben, nachdem ich fertig war hab ich die aus meinen Bookmarks wieder rausgeworfen, aber prinzipiell gibt es nur eine gute Doku von Apple und eine einigermaßen gute von Microsoft.
Wenn du irgendwo hängst kannst du mich auch direkt fragen, ich versuch gern zu helfen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das mit den Dokus kann ich voll und ganz bestätigen. Ich hatte auch mal mit dem Gedanken gespielt Unicode für Windows 9x zu unterstützen. Damit das mit meinem System möglich wäre hätte ich lediglich eine Tabelle aus dem Font auslesen und verarbeiten müssen. Allerdings selbst mit ein Beispielcode von Microsoft habe ich das nicht hinbekommen. In FreeType2 wurde das Problem im übrigen auch komplett anders gelöst. Und zwar so anders, dass ich nicht mehr wusste wie ich das hätte machen sollen.
Ja. Die wglUseFontBitmap sind ganz grausig. Ist aber auch nicht weiter verwunderbar, denn die Stammen aus der allerersten OpenGL Version von 1992. Und 28 Jahre später kann man so nicht mehr arbeiten. Und die Polygonvariante davon ist zwar skalierbar aber du hast immer Objekte mit einer Rückseite. Ist also total Langsam, umständlich in der Handhabung und Unicode? Kann man das essen?
TextSuite: Wie Aya schon gesagt hatte. Die Bibliothek ist Quelloffen. Allerdings in Pascal geschrieben. Das Paket enthält neben den Pascal Quellen auch eine def Datei und einen C Header. Die Lizenz der Bibliothek erlaubt dir alles. Außer natürlich zu behaupten die Bibliothek wäre von jemanden anderes geschrieben.
Was das Zeichnen angeht verhält sich ausgegebener Text wie eine ganz normale Textur. Wärend dem Zeichnen würden die Koordinaten nicht angepast werden. Es gibt allerdings 2 Modies zum Ausgeben von Text. Im SingleLine Modus musst du den Koordinatenursprung entsprechend setzen. Das ließe sich durch glPushMatrix und glPopMatrix kontrollieren. Im MultiLine Modus würdest du ein virtuelles Rechteck definieren und darin würde der Text gezeichnet werden. Als Beispiel bei einem Button. Der an der Koordinate 0,0 anfängt (weil mit Translate verschoben) würde das Reckteck die Koordinaten 0, 0, Breite, Höhe bekommen. Koordinaten werden dabei gar nicht angefasst. Der Text darin könnte automatisch umgebrochen und zentriert werden. Ohne Zutun wäre der Text immer in der Mitte.
Kleine Anmerkung am Rande. In der TextSuite benutze ich noch dem Imediate Mode zum Zeichnen. glBegin(QUAD) ... glEnd. In einer der letzten Versionen hatte ich die Positionierung der einzelnen Zeichen von glTranslate auf temporäre Variablen und absolute Positionsangaben bei glVertex umgestellt und habe beim Zeichnen mal eben knapp 20% Zeit eingesparrt. War aber auch ein Benchmark der nichts anderes gemacht hatte.
Was die Skalierung angeht. Das ist ein generelles Problem. In der TextSuite habe ich zwar etwas eingebaut um das ein bisschen praktibler zu gestalten allerdings kann ich bei TexturFonts nur generell davon abraten so etwas zu tun. Die Schrift sieht dann einfach nicht mehr schön aus. Bei Texturfonts müsste man die dann Freigeben und neue Fonts in der entsprechenden Größe erstellen. Also nicht Skalieren sondern die Schriftgröße dynamisch anpassen. Was sich aber wahrscheinlich nicht so einfach mit dem gui resize (glScale?) vertragen wird. Müsste man wohl wieder push und pop matrix machen. Wenn die Elemente per Hand vergrößert werden dann sollte es ein leichtes sein.
Registriert: Sa Jul 10, 2010 16:22 Beiträge: 16
Programmiersprache: C++
Ich denke an das Erzeugen der Outline wage ich mich erstmal noch nicht ran, habe noch genug andere Dinge zu erledigen. Ich habe aber gerade gesehen, dass man sich ja mit FreeType die Outline zurückgeben lassen kann. Ich dachte dafür wäre FTGL zuständig. Damit kann ich mir ja die FTGL Lib sparen. Scheint ja eh nicht weiterentwickelt zu werden und ist wohl zu den neuen FreeType Versionen auch nicht mehr kompatibel. Außerdem möchte ich meine Anwendung demnächst Opengl > 3.0 kompatibel machen. Wie würde ich die Font also rendern? FTGL nutzt dafür Displaylisten. Ich möchte ja nicht nur die Outline sondern das ganze Zeichen rendern. Muss ich dann noch Tesselation drauf anwenden? Und wie würde ich die geladenen Fontzeichen im Speicher (evtl. GPU-Ram) ablegen? Mit VBO's?
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.