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

Aktuelle Zeit: Fr Jul 18, 2025 21:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Apr 11, 2007 17:11 
Offline
DGL Member

Registriert: Mo Mär 26, 2007 21:56
Beiträge: 12
Hallo Forum!

Das Rendern von Text über wgluseoutlines funktioniert einwandfrei, allerdings habe ich nur Kantenglättung, wenn ich den Font als Wireframe aus Linien erstelle, aber nicht so wie ich es brauche aus Polygonen. Dann siehts total eckig aus, siehe Bild.

Ich benutze u. a. folgenden Code:
Code:
  1. glenable(GL_LINE_SMOOTH);
  2. glenable(GL_POLYGON_SMOOTH);
  3. glenable(GL_BLEND);
  4.  
  5. glhint(GL_LINE_SMOOTH, GL_NICEST);
  6. glhint(GL_POLYGON_SMOOTH, GL_NICEST);
  7. glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);


Zum Font erzeugen:
Code:
  1. fontbase := glGenLists(256);
  2. font := CreateFont(-24,
  3.   0,
  4.   0,
  5.   0,
  6.   0,
  7.   0,
  8.   0,
  9.   0,
  10.   ANSI_CHARSET,
  11.   OUT_TT_PRECIS,
  12.   CLIP_DEFAULT_PRECIS,
  13.   ANTIALIASED_QUALITY,
  14.   FF_DONTCARE or DEFAULT_PITCH,
  15.   'Bitstream Vera Serif');
  16. wglUseFontOutlines(DC,
  17.   0,
  18.   255,
  19.   fontbase,
  20.   0.001,
  21.   0.1,
  22.   WGL_FONT_POLYGONS,  // bzw. WGL_FONT_LINES
  23.   @gmf);


Zur Ausgabe:
Code:
  1. glCallLists(length(text), GL_UNSIGNED_BYTE, Pchar(text));


Wie kann ich es erreichen, dass die Fonts geglättete Kanten bekommen, wenn sie aus Polygonen statt Linien gezeichnet werden?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von pokerpilot am Sa Apr 14, 2007 11:29, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 11, 2007 18:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Das sind Polygone. Die Kanten von Polygonen werden natürlich nur sinnvoll geglättet, wenn du Antialiasing aktivierst. Also entweder im Treiber oder bei der Erstellung des Kontexes.

Dazu solltest du dir mal folgendes Thema anschauen. Das das als Linien geglättet wird darauf solltest du dich nicht verlassen. Sobald du eine Hardware findest die das nicht kann ist zappenduster.

Und solltest du das nicht wollen wirst du wohl um TexturFonts nicht drumherum kommen. Weil du nur mit diesen weiche Kanten hinbekommst. Die "alten" Möglichkeiten können das nur bedingt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 12, 2007 14:48 
Offline
DGL Member

Registriert: Mo Mär 26, 2007 21:56
Beiträge: 12
Vielen Dank, Lossy eX! Dann werd ich wohl zu Texturfonts wechseln. Gibt es da zufällig schon eine fertige Font-Klasse (nicht SDL)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 12, 2007 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja das ewig missverstandene Mysterium der Texturfonts. Es gibt zwar 1-3 Lösungen aber so wirklich berauschend sind die alle nicht. Ich bastel da gerade an etwas und wenn ichs nicht versaue dann ist das sogar benutzbar. :twisted: Aber dauert wohl noch etwas.

Derzeit bleibt dir nur anderes übrig. Und das schlimmste ist, dass Windows die Schriften leider nicht immer glättet, weswegen du bei ungünstigen Schriften bis zu großen Schriftgrößen keine Glättung hast.

Mars hatte irgendwann mal einen Generator geschrieben der praktischerweise gleich koordinaten mit erzeugt hatte. Habe aber keinen Link zur Hand. Ist irgendwo in Offtopic und 1-2 Jahre her.

Du solltest dir aber mal das Kapitel Schrift aus Texturen aus dem Artikel Text ausgeben anschauen. Dort wird auch auf den Artikel Tool verlinkt. In diesem findest du unter "2D/Texturen-Tools" den Bitmap Font Builder. Für diesen gibt es aber leider keinen Header. Also musst du das selber berechnen. Da die Buchstaben in einem Raster angeordnet sind sollte das halbwegs erträglich sein.

Ich hatte früher auch mal so etwas versucht. In diesem Beitrag kannst du sehen wie man es verwenden kann. Ein Stück oberhalb sind links auf die Quellen aber diese funktionieren nicht mehr. Du kannst aber hier die glText und die glBitmap downloaden. Der Code der glBitmap hat sich aber verändert weswegen du
Code:
  1.  Font.Texture.BuildMipMaps := False; // No MipMaps
  2.  Font.Texture.TextureFormat := tf32Bit; // 32 Bits color Delpth. Also could be tf16. But tfCompressed could have bad quality with some fonts

durch
Code:
  1.  Font.Texture.MipMap := mmNone; // No MipMaps

ersetzen musst. Die Zweite Zeite ist eigentlich überflüssig.

Das Tool zum Erstellen der Fonts kannst du hier finden. Das heißt FontCreation und gibt es als Binarys bzw auch als Sourcen. Aber erwarte bitte keine Wunder. Die Texte die dabei entstehen sind alles andere als Gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 13, 2007 20:00 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Normale Texturefonts würde ich als Alpha-Only Tex erstellen, und mit normalem alphablending rendern. Geht solange die orginalschriftgröße mit der gerenderten identisch ist, und du keine besonderen ansprüche an die Zeichenabstände hast gut und einfach.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 11:28 
Offline
DGL Member

Registriert: Mo Mär 26, 2007 21:56
Beiträge: 12
Vielen Dank für die umfangreiche Antwort, Lossy eX! Da ist einiges bei gewesen was ich verwenden konnte. Habe es im Moment genauso gelöst wie es The Winner vorgeschlagen hat (denke ich jedenfalls: weißes bild und nur im Alpha-Kanal die Schrift erstellt. Richtig so?). Funktioniert ganz gut soweit. Jetzt muss ich nur noch für 4 verschiedene Schriftgrößen Texturen erstellen. Und da ich immer die gleiche Schriftart verwende werde ich wohl nicht auf dein Projekt (wow! sieht echt klasse aus!) warten.

Ich denke meine Frage ist beantwortet. Vielen Dank!


pokerpilot


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 14, 2007 15:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Lossy eX hat geschrieben:
Mars hatte irgendwann mal einen Generator geschrieben der praktischerweise gleich koordinaten mit erzeugt hatte. Habe aber keinen Link zur Hand. Ist irgendwo in Offtopic und 1-2 Jahre her.

Den Artikel findet man hier: http://www.delphigl.com/forum/viewtopic.php?t=2702&highlight=font+generator

Ich selbst nutze das Tool von Mars auch, und bin sehr zufrieden. Da Mars auch gleich Routinen veröffentlicht hat, mit denen man auf die mitgelieferten Koordinaten der Schriftzeichen zugreifen kann, hat man sehr schnell brauchbare Ergebnisse erzielen. Wie das am Ende aussehen kann, siehst Du in dem Thread selber, oder "in Aktion" in meinem aktuellen Projekt Memory (http://www.delphigl.com/forum/viewtopic.php?t=6297). Wobei dort fast schon stark weichgezeichnet wird, was man aber über Nachbearbeitung des Bitmaps mit Blur und über das Blending selbst steuern kann.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 16, 2007 00:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hatte Probleme mit den Fonts von Mars. Vermutlich lags nicht an Mars, aber die Schrift im PBall Manager 2 sah einfach grausich aus.
Wenn es nen 3. Teil geben sollte hätte ich schon ne bessere alternative parat. Ich hab nen GL_TTF_Loader (Java) geschrieben. Dort kann ich aus einem beliebigen TTF Font zur laufzeit ne Textur machen, die ich dann benutzen kann. Probleme gibts nur bei "Zwischengrößen". Da tanzen die Buchstaben manchmal in der verticalen aus der Reihe.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 16, 2007 23:11 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Du kannst das bild auch als alphaonly hochladen, dann sollte es nur 1/4 der VRAMs brauchen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 07:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Flash schrieb:
Zitat:
Probleme gibts nur bei "Zwischengrößen". Da tanzen die Buchstaben manchmal in der verticalen aus der Reihe.


Ich hatte mit meiner FreeType Font genau das gleiche Problem. Geholfen haben mir die Tipps auf http://gpwiki.org/index.php/OpenGL:Tutorials:Font_System, und zwar was die Höhe der Buchstaben betrifft der Abschnitt "// Set the font size" betreffend den ascend und descend (befindet sich mitten in dem Quellcode drin).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 13:18 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Willst du damit sagen, dass die Ascent/Descent werte die ich bekomme fehlerhaft sind (unreliable)?
Das wär schon bisl blöd. Muss ich mir mal angucken.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ascent und Descent sind Fontabhängig. Ändern sich als nicht von Zeichen zu Zeichen. Du musst dir also von den verwendeten Fonts das maximale Ascent suchen und dann weißt du wo sich die Baseline befindet. Mit der kannst/musst du dann die Texte an einer Linie ausrichten.

Allerdings gibt es bei SDL_TTF noch etwas anderes. Wenn du dir ein Glyph mit TTF_RenderGlyph_* geben lässt, dann beinhaltet dieses keinen Rand mehr. Mit TTF_RenderUNICODE_* bekommst du allerdings ein Bild was immer so Hoch ist wie die Zeile hoch wäre. Mit RenderGlyph müsstest du dir aus der Metric den MinY Wert holen und mit diesem erst einmal die Position der Baseline in dem Bild berechnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 15:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich verwende kein SDL. Ich mach das mit Java so.

Code:
  1. public TTF_Font loadFont(String path, float size, String name, GL aGL) throws TTF_FontLoadException
  2. {
  3.     BufferedImage canvas = new BufferedImage(512,512,BufferedImage.TYPE_4BYTE_ABGR);
  4.     Graphics2D context = canvas.createGraphics();
  5.     FontRenderContext fontRC = context.getFontRenderContext();
  6.     Font font;
  7.     try
  8.     {
  9.         InputStream is = new FileInputStream(path+name+".ttf");
  10.         font = Font.createFont(Font.TRUETYPE_FONT,is);
  11.         font = font.deriveFont(size);
  12.         is.close();
  13.     }catch (FileNotFoundException e)
  14.     {
  15.         System.err.println("TTF_Loader: File not found: "+path);
  16.         return null;
  17.     }catch (FontFormatException e)
  18.     {
  19.         System.err.println("TTF_Loader: Format exception while loading font: "+path);
  20.         return null;
  21.     }catch (IOException e){
  22.         System.err.println("TTF_Loader: IO exception while loading font: "+path);
  23.         return null;
  24.     }
  25.    
  26.     context.setFont(font);
  27.     context.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  28.     context.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  29.     context.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
  30.    
  31.     Rectangle2D difs = font.getMaxCharBounds(context.getFontRenderContext());
  32.     Vector coords = new Vector();
  33.    
  34.     float x = 0;
  35.     float y = 0 + (float)difs.getHeight();
  36.    
  37.     for (int i = 0; i <= 255; i++)
  38.     {
  39.         TextLayout layout;
  40.         if (i != 32) //Space needs special workaround
  41.         {
  42.             layout = new TextLayout(""+(char)i, font, fontRC);
  43.         }else
  44.         {
  45.             /*
  46.              * Because space is interpreted as a point we have to define
  47.              * the dimensions of a space ourselfs. We take the boundaries of
  48.              * "-" for this.
  49.              */
  50.             layout = new TextLayout("-", font, fontRC);
  51.         }
  52.         Rectangle2D bounds;
  53.         bounds = layout.getBounds();
  54.         context.drawString(""+(char)i, x, y);
  55.        
  56.         //Add some space to the bounds to avoid char clipping.
  57.         bounds.setRect( x + bounds.getMinX() -2  , y + bounds.getMinY() -2,
  58.                         bounds.getWidth() +4    , bounds.getHeight() +4);
  59.        
  60.         /*bounds.setRect( x + bounds.getMinX()  , y + bounds.getMinY(),
  61.                 bounds.getWidth()    , bounds.getHeight());
  62.         */
  63.         coords.add(bounds);
  64.        
  65.         x = x + (float)difs.getWidth() + 2;
  66.         if (x + (float)difs.getWidth() > canvas.getWidth())
  67.         {
  68.             x = 0;
  69.             y = y + (float)difs.getHeight() + 2;
  70.         }
  71.     }
  72.    
  73.     Texture tex = TextureIO.newTexture(canvas,false);
  74.    
  75.     if (tex == null) throw new TTF_FontLoadException("TTF_Loader: Failed to create font texture.");
  76.    
  77.     TTF_Font result = new TTF_Font( font,
  78.                                     fontRC,
  79.                                     tex,
  80.                                     coords,
  81.                                     name,
  82.                                     aGL);
  83.            
  84.     return result;
  85. }

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 17, 2007 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@Flash: zu diesem Quellcode kann ich nichts sagen, weil ich das ganz anders mache.
@Lossy: Ich lasse mir von FreeType die Glyphs in ein Bitmap rendern, und diese verflixten Bitmaps sind alle verschieden groß. Ohne Ascend/Descend (wie in dem Tutorial angegeben) waren meine Buchstabenreihen wie Berg und Tal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 18, 2007 08:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Traude: Genau das meine ich ja auch. ;) Und so muss ich das ja auch machen. Na ja. Und noch ein paar Kleinigkeiten mehr.

Flash: Also ich kenne mich mit Java nicht so super aus. Bzw. ist eher das Problem, dass ich keine Ahnung welches Objekt dort was darstellt. Aber das TextLayout hat ein getAscent. Mit dem sollte deine Zeichen an einer Linie ausrichten können. Und typischerweise ist die Breite des Buchstabend in getAdvance enthalten. Da einige Zeichen wie ein i oder l etwas mehr Abstand haben sollten als ein a. Von daher musst du nicht um jeden Buchstaben einen 2 Pixel breiten Rand ziehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.010s | 15 Queries | GZIP : On ]