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

Aktuelle Zeit: Mi Jul 16, 2025 19:22

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textausgabe mit OpenGL zu lahm!
BeitragVerfasst: Mi Mär 31, 2004 13:07 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also zur Zeit hau ich Text mit folgendem funktionablen aber langsamen Code auf'n Schirm:
Code:
  1. procedure PrintText(TextPosX, TextPosY: GLuint; Text: string; R,G,B :single; Typ : byte);
  2. //Gibt den String in \"Text\" an der Stelle (TextPosx, TextPosy) in der Farbe, die RGB ergibt und der Schrift \"Typ\"aus
  3. begin
  4.      glPushAttrib(GL_ENABLE_BIT or GL_DEPTH_BUFFER_BIT);
  5.  
  6.        glDisable(GL_DEPTH_TEST);
  7.        glDisable(GL_TEXTURE_2D);
  8.        glDisable(GL_LIGHTING);
  9.  
  10.        glMatrixMode(GL_PROJECTION);
  11.        glPushMatrix;
  12.  
  13.          glLoadIdentity;
  14.          glOrtho(0.0, UMain.Form1.ClientWidth, Form1.ClientHeight, 0.0, -5.0, 5.0);
  15.  
  16.          glMatrixMode(GL_MODELVIEW);
  17.          glPushMatrix;
  18.  
  19.            glLoadIdentity;
  20.  
  21.            glColor3f(R,G,B);
  22.  
  23.            glRasterPos2i(TextPosX, TextPosY);
  24.  
  25.            glPushAttrib(GL_LIST_BIT);
  26.              case typ of 0: glListBase(GVFontMC22);
  27.                          1: glListBase(GVFontMC30);
  28.                          2: glListBase(GVFontCN20)
  29.                          else glListBase(GVFontSS16);
  30.              end;
  31.              glCallLists(Length(Text), GL_BYTE, Pointer(Text));
  32.            glPopAttrib;
  33.  
  34.          glPopMatrix;
  35.  
  36.        glMatrixMode(GL_PROJECTION);
  37.        glPopMatrix;
  38.  
  39.      glMatrixMode(GL_MODELVIEW);
  40.      glPopAttrib;
  41.      glColor3f(1,1,1);
  42. end;

Das is wie gesagt sehr Performanz raubend. Also dacht ich mir, gibste den Text in einen Schwung aus und machst die ortho sachen etc. nur einmal.
Jetzt sieht meine Procedure so aus:
Code:
  1. procedure PrintTextE(TextPosX, TextPosY: GLuint; Text: string; R,G,B :single; Typ : byte);
  2. //Gibt den String in \"Text\" an der Stelle (TextPosx, TextPosy) in der Farbe, die RGB ergibt und der Schrift \"Typ\"aus
  3. // Funktioniert nur, wenn außerhalbd er Procedure alle nötigen Einstellungen gemacht wurden (siehe PrintText() )
  4. begin
  5.            glColor3f(R,G,B);
  6.  
  7.            glRasterPos2i(TextPosX, TextPosY);
  8.  
  9.            glPushAttrib(GL_LIST_BIT);
  10.              case typ of 0: glListBase(GVFontMC22);
  11.                          1: glListBase(GVFontMC30);
  12.                          2: glListBase(GVFontCN20)
  13.                          else glListBase(GVFontSS16);
  14.              end;
  15.              glCallLists(Length(Text), GL_BYTE, Pointer(Text));
  16.            glPopAttrib;
  17. end;

(Der Teil der gegenüber obiger Version Fehlt muss jetzt per hand beim Aufruf eingefügt werden. Dafür aber nur einmal.)

Leider is das aber noch net schnell genug. Ich will mehr!! Mein (Selbstgezeichneter) Cursor ruckelt sobald (20 Zeilen) Text angezeigt wird. Hat jemand ne optimierungs Idee, oder bessere Version parat?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 31, 2004 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Texture Fonts bei denen man jeden Buchstaben als Quadrat zeichnet sind schneller als Bitmap Fonts. Ich würde da Texture Fonts benutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 31, 2004 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Und wie es der Zufall haben will, habe ich gestern ein kleines Programm zu diesem Thema geschrieben:
http://www.delphigl.com/forum/viewtopic.php?t=2702

Einfach die Quads mit den entsprechenden Texturkoordinaten zeichnen (die Breite eines Schriftzeichens = x2 - x1, die Breite der Quads sollte halbwegs proportional dazu sein), und fertig ist das Ganze und läuft auch sehr schnell.

Wenn du ganz optimieren möchtest, machst du bei einem String Folgendes:

Code:
  1. glBegin(GL_QUADS)
  2.   zeichne hier alle Zeichen mit glTexCoord und glVertex Kommandos
  3. glEnd;


anstelle einzelne glBegin/glEnd Blöcke zu verwenden, sollte aber auch ohne diese Optimierung locker schnell genug sein.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 31, 2004 23:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Zeichnen von Texturierten Quads is schneller als die Fonts die ich verwende? :shock:
@Mars: das muss ich mir erst mal angucken... Is dass denn mit ner menge schreibarbeit verbunden. Ich muss ja erstmal rausfinden welcher buchstabe und dann muss ich den entsprechenden Buchstaben mit Quad zeichnen. Und was mach ich wenn ich ne spezielle Farbe haben will? Weise Buchstaben und dann mit glColor3f() ?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 01, 2004 02:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Ja - texturierte Quads (oder Trianglestrips) sind so ziemlich der schnellste Weg Zeichen darzustellen - ist ja auch logisch, da sämtliche aktuellen 3D-Beschleuniger dahingehend optimiert sind, texturierte Dreiecke möglichst schnell darzustellen.

Der Code ist sogar einfacher als der, den du jetzt verwenderst - ich poste mal die Routine, die ich verwende, um Text mit verschiedenen Zeichensätzen und Zeilenumbrüchen auszugeben:

Code:
  1. procedure TFramework.Write(s: String);
  2.  
  3.   var
  4.     x, y: float;
  5.     w, h: float;
  6.     i: integer;
  7.     c: byte;
  8.     fnt: PTexFont;
  9.  
  10.   begin
  11.     if (ActiveFont<Fonts) and (Font[ActiveFont]<>NIL) then
  12.       fnt := Font[ActiveFont]
  13.     else
  14.       exit;
  15.     x := 0;
  16.     y := 0;
  17.     fnt.Tex.Display;
  18.     glBegin(GL_QUADS);
  19.     for i:=1 to Length(s) do begin
  20.       c := Ord(s[i]);
  21.       w := fnt.CharPos[c].x2 - fnt.CharPos[c].x1;
  22.       h := fnt.CharPos[c].y2 - fnt.CharPos[c].y1;
  23.       if c=fnt.CR then begin
  24.         x := 0;
  25.         y := y - h;
  26.       end
  27.       else begin
  28.         glTexCoord2f(fnt.CharPos[c].x1, fnt.CharPos[c].y2);
  29.         glVertex2f(x*fnt.XScale, y*fnt.YScale);
  30.         glTexCoord2f(fnt.CharPos[c].x2, fnt.CharPos[c].y2);
  31.         glVertex2f((x+w)*fnt.XScale, y*fnt.YScale);
  32.         glTexCoord2f(fnt.CharPos[c].x2, fnt.CharPos[c].y1);
  33.         glVertex2f((x+w)*fnt.XScale, (y+h)*fnt.YScale);
  34.         glTexCoord2f(fnt.CharPos[c].x1, fnt.CharPos[c].y1);
  35.         glVertex2f(x*fnt.XScale, (y+h)*fnt.YScale);
  36.         x := x + w;
  37.       end;
  38.     end;
  39.     glEnd;
  40.   end;
  41.  


XScale und YScale sind normalerweise 1 - ich finde es aber angenehm auf diese Weise schnell "große und kleine" Schriften zu bekommen, ohne mit der ModelView Matrix herumkaspern zu müssen.

Farben kannst du tatsächlich mit glColor Kommandos einstellen, oder du verwendest den generierten Font als Alphamaske einer anderen Textur, oder du bearbeitest das Ganze in einem Bildbearbeitungsprogramm - die Koordinaten ändern sich dadurch ja nicht (nicht mal wenn du das Bild vergrößerst oder verkleinerst, da Texturkoordinaten immer zwischen 0 und 1 liegen).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


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


Wer ist online?

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.

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