Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Hallo,
es gibt ja bekanntlich die Möglichkeit mit OpenGL 3D-Fonts auszugeben. Das können entweder Bitmap- oder TrueType-Fonts sein. Ich habe leider zwei Probleme damit.
1. Die Größe des Fonts ist immer gleich, egal welche Parameter ich bei Createfont angebe.
2. Ich kann den einem Device-Context zugewiesenen Font nicht mehr löschen und durch einen anderen ersetzen. Das muss dann so geschehen, dass ich den Device- und Rendering-Context lösche, einen neuen erzeuge und diesem dann wieder einen Font zuweise. Leider muss ich dann das ganze Environment sichern (Texturen, ...) und nacher wieder herstellen.
Zum ersten Punkt habe ich mir schon jede Menge Tutorials und Beispielprogramme angeschaut. Aber auch die Beispielprogramme haben dieses Problem. Die Fontgröße ist nicht zu ändern.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also 3D Fonts sind keine Bitmap fonts. Wirf die bitte nicht zu sehr ineinander. Die werden zwar beide in OpenGL verwendet habe aber so sonst nicht viel gemeinsam außer, dass sie Fonts sind.
Bei Bitmapfonts kann man die Größe beim Erstellen angeben. Und bei 3D Fonts spielt die Schriftgröße eher nur eine untergeordnete Rolle. Du hast ja schließlich ein Scale. Das die Buchstaben teilweise bei einer anderen Größe auch anders aussehen ist ein anderes Problem.
Und zum Erstellen der Fonts. Habe es bisher noch nicht mit OpenGL ausprobiert aber an einem DC kann man sehr wohl unterschiedliche Fonts binden. Das habe ich mit der GDI selber schon häufig genug gemacht. Und darauf bauen die Funktionen für OpenGL nun mal auch auf also sollte es mich wundern, wenn es nicht gehen sollte. Aber sonst befürchte ich werden wir ohne Code wohl nur Raten können.
Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Entschuldigung, Entschuldigung,
da drückt man sich mal etwas ungenau aus und wird direkt abgemahnt.
Man kann mit OpenGL auf zwei Arten Fonts erstellen:
mit wglUseFontOutlines und
mit wglUseFontBitmaps
Habe ich nun einen Font angelegt (siehe Code), dann kann ich dessen Größe im Programm nicht mehr ändern. Das ist unabhängig von der Art des Fonts. Ist ein Font einmal einem DC zugewiesen, kann ich, auch wenn ich das Objekt lösche und wieder neu anlege, dessen Größe nicht mehr ändern.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Andyh hat geschrieben:
Entschuldigung, Entschuldigung,
da drückt man sich mal etwas ungenau aus und wird direkt abgemahnt.
Bitte? Mal bloß nicht überragieren. Habe nur gesagt, dass BitmapFonts und PolygonFonts anders sind. Wenn ich irgendwie jemanden "abmahne" dann hört man das sehr deutlich. Das war nicht mal ne Kritik. Nur ein Hinweis, dass die unterschiedlich sind. Mehr nicht. Also es gibt keinen Grund warum du dich angemacht fühlen musst. Außer höchstens, weil ich vielleicht manchmal ein bisschen arogant bin.
Jetzt aber mal zu dem Fontproblem. Habe es gerade selber mal ausprobiert und hat sofort mit 2 Fonts geklappt. Habe da so auch keinen Unterschied entdeckt bis auf Eines. Ich rufe bei mir kein SelectObject (DC, 0) auf. Also ich setze das Font einfach so. Evtl verschuckt er sich ja daran. Der Rest ist im Groben und Ganzen ziemlich gleich. Kannst dir ja auch mal in meiner Unit glText die Klasse TglPolygonText anschauen. Alles recht unspektakulär und ziemlich genau so wie bei dir.
Ich traue es mich ja fast nicht zu sagen. Aber in deinem Code ist etwas was man normal nicht macht. Bzw nicht machen muss. Und zwar einen Pointertyp auf eine Klasse. Das ist doppel gemoppelt und somit schon wieder unnötig gefährlich. Klassen sind bereits Pointer. Somit ist es völlig legal, wenn die einfach so benutzt. Bei Records und den veralteten Object (die ich kategorisch ablehne) braucht man wieder einen Pointertyp. Aber auch nicht immer. Aber ich glaube ich schweife ab.
Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Jaja, das ist schon schwierig aus einem Text Emotionen abzulesen.
Weder Du noch ich haben es harsch, böse oder auch sonst nur im mindesten negativ gemeint, was wir geschrieben haben. Aber je nachdem wie man den Text liest, kann man ihn so oder so verstehen. Man könnte es ja auch als witzig gemeint auffassen.
Also: ich bin ein gaaaanz lieber...
Ich werde mir das mal näher anschauen. Danke erst einmal.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Andyh hat geschrieben:
Also: ich bin ein gaaaanz lieber...
Ja schon klar. "Er will nur spielen." Aber okay. So viel zu missverständlichen Äußerungen und ihre Wirkungen.
Wo erstellst du denn deine Fonts? Evtl ist das ja eine Stelle die nicht so glücklich ist. Konnte wie gesagt keinen Unterschied zwischen deiner Erstellung und meiner finden.
Bzw. Polygonfonts haben immer eine Höhe von 1! Egal welche Größe du angibst. Die Größe wird sich nur bei den Zeichen äußern, da die teilweise etwas unterschiedlich sein können in anderen Größen. Aber die OpenGL Höhe von 1 dient dazu um die späteren Positionierungen und Berechnungen damit zu vereinfachen. Vielleicht funktioniert es ja nur du gehst davon aus, dass sie eine Höhe von 16 oder so haben.
PS: Smileys. Oh mein Gott. Was habe ich angerichtet.
Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
Folgendes habe ich bisher akzeptiert:
lege ich mit wglUseFontOutlines einen Font an, hat der die Größe 1 und muss von mir entsprechend der erforderlichen Größe in meiner Szene skaliert werden um sich der Umgebung anzupassen. Das ist ja auch weiter nicht schwierig, muss halt nur in der Printmethode der Komponente programmiert werden. Da habe ich ja die gewünschte Fontgröße und kann die Ausgabe des Texts mit glScaled oder glScalef anpassen.
(ich habe meinen Beispielcode oben angepasst und ausprobiert. es klappt wunderbar. Danke)
Folgendes Problem besteht immer noch:
habe ich mit meiner Komponente einen Font angelegt, hängt der am DC, der als Parameter glFontDC an die Methode Buildfont übergeben wurde. Will ich diesen Font jetzt durch einen anderen ersetzen, mache ich ein Free auf den aktuellen Font und lege einen neuen an, der auch wieder an den DC gebunden wird. Da das Free ein Killfont ausführt gehe ich davon aus, dass der DC jetzt ohne Font dasteht. Dem scheint aber nicht so zu sein. Ich kann so viele Fonts freigeben und wieder neu anlegen wie ich will, der zuerst an den DC gebundene Font bleibt. Habe ich als ersten Font z.B. Arial gewählt, mache ein Free und lege dann einen neuen Font an der Times New Roman ist, so sehe ich dann trotzdem noch die Schrift in Arial.
Die Frage ist: sollte das grundsätzlich so gehen wie ich mir das vorstelle?
Wenn Nein: wie geht es dann?
Wenn Ja: wo ist der Fehler verborgen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja das ist eine gute Frage. Also ich lösche sie erst ganz zum Schluss. Zur Not probiere mal aus wie es aussieht, wenn du das andere Font einfach erstellst und als neues Objekt für den DC auswählst. Ohne noch einmal irgendetwas anderes auszuwählen. Aber ich wüsste so jetzt nichts, dass man da irgendwie etwas ganz speziell machen muss.
Registriert: Do Jun 09, 2005 13:48 Beiträge: 117 Wohnort: Sankt Augustin
So einfach geht das. Man muss nur jemand kennen, der einen kennt...
Der Tipp war super, es klappt. Ich lasse die Fonts jetzt bestehen und selektiere einfach einen neuen für den DC. Wenn das Programm beendet wird, mache ich alle weg.
Ich hatte mich so in die Idee verannt, dass man den Font erst vom DC lösen muss um einen neuen darnzukleben, dass ich richtig riesig große Scheuklappen um die Augen hatte.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Keine falschen Hoffnungen. Ich kenne mich damit auch nicht aus. Also, dass ein SelectObject mit 0 zu einem einfriehren führt war mir auch neu. Ich kenne es nur so, dass man bei einem SelectObject das vorherige Sichert (den Rückgabewert von SelectObject) und nach getaner arbeit dann SelectObject mit diesem Wert aufruft. Evtl könntest du das bei dir ja auch so machen. Dann könntest du dein Font auch gefahlos frei geben.
Code:
procedure BuildFont ...
begin
OldHandle := SelectObject(DC, NewHandle);
wglUseFontOutlines(...);
SelectObject(DC, OldHandle);
end;
PS: So im nachhinein überlegt hätte ich das auch früher sagen können Aber da kann ich mir vertrauensvoll meine eigene Signatur unter die Nase halte.
[OT] Wobei die Fähigkeit zur Selbstkritik durchaus ein Zeichen von Intelligenz ist.[/OT]
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.