Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 21:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schrift wird nicht angezeigt
BeitragVerfasst: Di Mai 13, 2008 16:14 
Offline
DGL Member

Registriert: Di Apr 01, 2008 11:05
Beiträge: 14
Hallo!

Ich habe versucht eine Schrift mit Hilfe der WIKI auf den Schirm zu kriegen http://wiki.delphigl.com/index.php/wglUseFontOutlines
Den Artikel finde ich eigentlich sehr gut, da ja ein Code-Beispiel vorhanden ist.
Nur leider habe ich den Teil mit den Display Listen nicht verstanden. Wenn ich dem Link folgen will, bekomme ich als Antwort, dass nur User drauf zugreifen dürfen(Wie auch bei eingigen anderen links der wiki).

Leider tut sich auf dem Schirm gar nichts. Ein Fehler wird vom Error Handler nicht ausgegeben.
Sitze hier jetzt schon einige Stunden vorm Lappi in der Sonne und drehe mich im Kreis. Kann meinen Fehler nicht finden.
Wie wird die Font Liste überhaupt erstellt?

Da mein Programm nicht sehr umfangreich ist werde ich es mal fast komplett posten:

Code:
  1.  
  2. var
  3.   Form1: TForm1;
  4.   FontLists:Cardinal;
  5.   agmf:array [0..255] of GLYPHMETRICSFLOAT ;
  6.  
  7. procedure TForm1.FormCreate(Sender: TObject);   //OpenGL initialisieren
  8.   begin
  9.   DC:= GetDC(Handle);  //den Gerätekontext?(Device Context) von Form1 abfragen
  10.   if not InitOpenGL then Application.Terminate;
  11.   RC:= CreateRenderingContext( DC,      // Rendercontext erzeugen
  12.                                [opDoubleBuffered], // Renderoption
  13.                                32,  //Farbtiefe etc...
  14.                    
  15.             24,
  16.                                0,0,0,
  17.                                0);
  18.   ActivateRenderingContext(DC, RC); // Rendercontext aktivieren
  19.   SetupGL; // SetupGL aktivieren
  20. end;
  21.  
  22. procedure TForm1.Render;
  23.  
  24.   begin
  25.   //Farbbuffer und Tiefenpuffer entleeren
  26.  
  27.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  28.  
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity;
  31.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  32.  
  33.   glMatrixMode(GL_MODELVIEW);
  34.   glLoadIdentity;
  35.   glTranslatef(-1,0,-5);
  36.   glColor3f(0,0,0);//Farbe Gel
  37.   showtext('test');
  38.   SwapBuffers(DC); // Bild ausgeben
  39. end;
  40.  
  41. procedure TForm1.Schriftaktivierung;
  42. var
  43.   CustomFont:HFont;
  44. begin
  45.   CustomFont := GetStockObject (SYSTEM_FONT);
  46.  
  47.   CustomFont := CreateFont(
  48.                            32,                  // Höhe
  49.                            0,                   // Breite 0=Keine Vorgabe
  50.                            0,
  51.                            0,
  52.                            0,                   // Fett?
  53.                            0,                   // Kursiv?
  54.                            0,                   // Unterstrichen?
  55.                            0,                   // Durchgestrichen?
  56.                            ANSI_CHARSET,
  57.                            OUT_TT_PRECIS,
  58.                            CLIP_DEFAULT_PRECIS,
  59.                            NONANTIALIASED_QUALITY,
  60.                            FF_DONTCARE or DEFAULT_PITCH,
  61.                            'Arial'); // Name der Schrift
  62.   glEnable(GL_POINT_SMOOTH);
  63.   SelectObject(DC, CustomFont);
  64.   wglUseFontOutlines(DC,
  65.                      0,   //Von Zeichen #0
  66.                      255, //Bis Zeichen #255
  67.                      FontLists,
  68.                      0, //So genau wie möglich
  69.                      0.2, //0.2 LE tiefe Buchstaben
  70.                      WGL_FONT_POLYGONS,//Polygone
  71.                      @agmf);//Speichere dort die Informationen
  72. end;
  73.  
  74.  
  75. procedure TForm1.ShowText(pText:String);
  76. begin
  77.    glListBase(FontLists);// Liste auswählen
  78.    glCallLists(Length(pText), GL_UNSIGNED_BYTE, Pointer(pText));
  79. end;


Habe ich eventuell eine Variable nicht richtig gesetzt oder eine Reihenfolge verkehrt gemacht?
Da ich immer noch blutiger Anfänger mit Delphi und OpenGL bin, werde ich den wohl auch nicht mehr finden und das Forum gibt in dem Bereich leider auch nicht nicht so viel her. ;)
Bin wohl der einzige, der die Schrift nicht auf den Schirm kriegt :-/
Über ne Antwort würde ich mich sehr freuen!

Mfg Florian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 21:35 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Danke für den Hinweis. Der Displaylisten-Link wurde korrigiert. (rote links bedeuten eigentlich: Artikel existiert noch nicht. Allerdings gab es einen Displaylisten artikel - unter anderem Namen)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 10:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Die Schrift per Displayliste zu machen ist zwar simpel aber fürchterlich unperformant.
Durch die Umstellung auf die TextSuite von Lossy hab ich mal glatt das 5fache an FPS rausgeholt. Und es sieht wesentlich besser aus. :)

Bei glColor3f(0,0,0) wirst du wahrscheinlich auch nicht viel sehen.
Und check mal NearClipping und FarClipping.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 10:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also was ich bisher von Lossys Bibliothekt gesehen habe, kann ich dir die auch nur empfehlen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 10:48 
Offline
DGL Member

Registriert: Di Apr 01, 2008 11:05
Beiträge: 14
Hi, danke für die Antworten! Near Clipping und FarClipping sollten nicht den Fehler machen( 1 und 1000) Die Hintergrundfarbe ist ein leichtes grau. Also sollten die Buchstaben bei schwarz gut sichtbar sein. Werde mal nach Lossys TextSuite gucken.

Kann mir jemand vielleicht erklären, was bei der Procedure ShowText passiert? Das mit den Listen verstehe ich nicht :-/

Mfg Florian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Bin wohl der einzige, der die Schrift nicht auf den Schirm kriegt :-/

Da kann ich doch beruhigen. Das ist eine "Geschichte voller Missverständnisse" ;) So lange ich OpenGL entwickel ist das schon immer einer der größten Probleme gewesen.

Um dir das Suchen etwas zu vereinfachen. Der Projektthread der TextSuite.

Allerdings FontOutlines sind polygonale Buchstaben und der "klassische" Text ist 2D. Also auf einer Ebene. Mit der TextSuite sind auch nur TexturFonts möglich. Brauchst du Buchstaben in 3D?

Wenn ja, dann etwas zum Verständniss. Du brauchst einen DeviceContext. Das ist unter Windows eine Objekt auf welchem Zeichenoperationen statt finden. In diesen wählst du ein Font, was du mit CreateFont erstellt hast und anschließen erstellst du mittels wglUseFontOutlines die Buchstaben in eine DisplayListe. Dabei entstehen 3D Modelle eines einzelnen Buchstaben. Für jeden Buchstaben ein einzelner Displaylistenplatz. Die 100ste Stelle müsste das kleine d sein.

Wenn du eine einzelne Liste ausführen willst, dann rufst du diese mit glCallListe(Liste) auf. Mit glListBase Teilst du OpenGL mit, dass du eine Art Offset hast. Als Beispiel nehm ich mal 100. Wenn du jetzt sagst glCallList(100), dann wird in Wirklichkeit die Liste 200 aufgerufen. Das spart dem Entwickler arbeit, da er nicht den Wert eines jedes Zeichen selber um das Offset verschieben muss sondern OpenGL macht das.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 15:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Da der Text in den Displaylisten ja anscheinend als Vektordaten vorliegt und man sie trotzdem in 2D benutzen kann, müssen das ja ziemlich große werte sein (denn 1px im Orthomodus ist normalerweise eine OGL-Einheit, in der Perspektive ist eine OGL-Einheit bei -5 Verschiebung auf der Z-Achse relativ groß). Vielleicht sind die einfach zu groß, versuch doch mal, weiter rauszuzoomen (kleinerer dritter Parameter in glTranslatef, z.B. -10 oder -20).

//Edit: Bei dir fehlt was:
Aus dem Wiki:
Code:
  1.   FontLists := glGenLists(256);

Das sollte noch an den Anfang deiner Fontinitialisierung, also nach if not InitOpenGL.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 21:08 
Offline
DGL Member

Registriert: Di Apr 01, 2008 11:05
Beiträge: 14
dank dir ! kann es leider erst morgen testen. verstehe noch nicht alles, was ich da so mache... Kommt Zeit kommt Rat ;)

@Lossy
Den Text möchte ich einfach nur können. Beim Mathematischen Pendel, welches mein erstes OpenGL Projekt war, hat die Schrift der Labels geflackert. Das hat mich ziemlich genervt. Mittlerweile gebe ich da alles auf nem Panel aus. Leider ist jetzt die Kugel gestaucht. Ich weiß noch nicht warum. Habe mich gestern aber auch erstmal um die Schrift gekümmert. Ob die Schrift nun 2 D oder 3 D ist, ist mir erstmal egal. Ich will es einfach nur hin kriegen. Nochmal zum Verständis. In der Liste werden alle Buchstaben gespeichert. Warum dann ausgerechnet 255 Zeichen? Ist das nicht nen bißchen viel? Das kleine d ist in der Ascii Tabelle nen d. Aber die Tabelle ist doch nur 120 Zichen oder s olang. Würde es nicht reichen. Alle Zeichen + Sonderzeichen in der Tabelle zu haben.
Ausserdem woher lädt er die Buchstaben beim Listen generieren?

Code:
  1.  
  2. CustomFont := CreateFont(
  3.                            32,                  // Höhe
  4.                            0,                   // Breite 0=Keine Vorgabe
  5.                            0,
  6.                            0,
  7.                            0,                   // Fett?
  8.                            0,                   // Kursiv?
  9.                            0,                   // Unterstrichen?
  10.                            0,                   // Durchgestrichen?
  11.                            ANSI_CHARSET,
  12.                            OUT_TT_PRECIS,
  13.                            CLIP_DEFAULT_PRECIS,
  14.                            NONANTIALIASED_QUALITY,
  15.                            FF_DONTCARE or DEFAULT_PITCH
  16.                            'Times New Roman'); // Name der Schrift


Wählt er die beim Namen der Schrift aus? Lädt er die also aus dem Font Ordner von Windows?

Wäre interessant zu Wissen.

Gute Nacht!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schrift wird nicht angezeigt
BeitragVerfasst: Mi Mai 14, 2008 23:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Hey,

was mir beim Betrachten so aufgefallen und dir vielleicht hilfreich ist:

1. Das Erzeugen über die WinAPI-Funktion CreateFont() ist doch arg umständlich. Warum stehen alle drauf? Die VCL gönnt uns doch das tolle TFont-Objekt. ;)
Code:
  1. var
  2.   Font: TFont;
  3.  
  4. // beim Schrift erstellen:
  5.   Font := TFont.Create;
  6.   try
  7.     Font.Name := 'Times New Roman';
  8.     Font.Size := 32;
  9.     Font.Style := [];
  10.  
  11.     SelectObject(DC, Font.Handle);
  12.     wglUseFontOutlines(...);
  13.   finally
  14.     Font.Free;
  15.   end;


Willst du bei deiner Fassung bleiben, wäre es sinnvoll, auch noch DeleteFont() zu callen.

2. Du speicherst die Daten in dem array of GLYPHMETRICSFLOAT. Ich bin mir ziemlich sicher, du wirst diese Daten nicht brauchen. Schmeiß die Variable raus und übergeb der Funktion einfach "nil". Definitionsgemäß wird selbige dann einfach darauf verzichten, die GlyphMetrics wohin zu schreiben.

3. Du setzt keinen glViewport(), keine Ahnung ob das was ausmacht. Vielleicht auch mal @pText[1] statt Pointer(pText) probieren. Letzteres kann meines Wissens funktionieren, muss aber nicht.

4. Wegen der Zeichen... ASCII hat 128 Zeichen, davon sind gerade mal 96 darstellbar (nämlich Nr. 33 bis 128). Die übliche ANSI-Kodierung erweitert ein Zeichen aber auf ein Byte und hängt 128 weitere Zeichen an den ASCII-Standard drin. Siehe vielleicht auch hier: http://de.wikipedia.org/wiki/ISO-8859. ASCII an und für sich enthält auch keine Umlaute oder ß.
Du hast in FontLists auch keine einzelne Liste, sondern FontLists ist die Nummer für die erste Liste, auf die dann 254 folgen. Die anderen Nummern muss man aber nicht einzeln speichern.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 00:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also wenn es dir nur um Text geht dann solltest du dir mal meine Bibliothek anschauen. Die ist genau für so etwas gedacht. Und zwar damit du nur noch sagen musst. Das und das Font und so und so soll der Text ausgegeben werden. Ich habe in dem einen Paket auch reichlich Beispiele dazugepackt.

Zum Verständnis. Mit CreateFont erstellst du ein Font mit dem Namen 'Times New Roman'. Windows sucht sich anhand des Namens dann die passende Fontdatei (oder eine default falls der Name nicht stimmt). Dieses Font wird auf einen DeviceContext (DC) gebunden und dann zur Erstellung der Zeichen benutzt. Im Windows läuft nichts ohne DC.

Die Displayliste kann man sich im übertragenen Sinn auch als Array vorstellen. Du sagst du brauchst Platz für 256 Stellen und OpenGL reserviert diesen dann (glGenLists). Mit wglUseFontOutlines werden dann die Zeichen erstellt die man angegeben hat. In deinem Fall die mit dem CharCode 0 bis 255. Du kannst natürlich auch sagen, dass du nur verschiedene Zeichen haben willst. Aber dann musst du selber verwalten an welcher Stelle welches Zeichen liegt. So ist es ziemlich einfach, da immer alle Zeichen existieren und man so genau weiß wo sie sich befinden. Das macht man einfach wegen dem Komfort.

Wenn es aber mal komplexer wird, dann kommt man um eine solche Verwaltung nicht umher. Aber ich denke, wenn man keine 20 Fonts hat, dann ist es nicht so tragisch, falls solch eine Verwaltung fehlt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 08:49 
Offline
DGL Member

Registriert: Di Apr 01, 2008 11:05
Beiträge: 14
Vielen Dank für die vielen und schnellen Antworten. Ich werde mich in der nächsten Woche näher mit euren Tipps beschäftigen. Nachdem Erzeugen der Liste hat das prima funktioniert.
Aber eure Lösungen scheinen mir wesentlich eleganter. Grade hinsichtlich der Performance und falls ich nur einen reinen 2 D Text brauche.
Werde nächste Woche nochmal die Ergebnsse posten!

Mfg Florian


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]