Problem beim Rendern von Zeichen mit Freetype und OpenGL

8

Ich habe versucht, eine einfache 2D-Spielengine zu entwickeln, und ich muss in der Lage sein, Text zu zeichnen, also entschied ich mich, die berühmte Freetype-Bibliothek zu verwenden. Mein aktuelles Ziel ist es, jedes Zeichen von 0 bis 255 zu rendern und die entsprechenden Informationen in einem Glyphenobjekt, den oberen und linken Positionen des Zeichens, der Breite und Höhe und einer OpenGL-Textur zu speichern. (In der Zukunft möchte ich 1 Textur pro Glyphe entfernen, aber bevor ich mit der Arbeit anfange, brauche ich meine Charaktere korrekt anzuzeigen). Zuerst habe ich alle Charaktere verstümmelt, aber dann habe ich diese Frage überprüft und herausgefunden, dass ich es getan habe um den Bitmap-Puffer in einen neuen mit OpenGL-erforderlichen Texturgrößen zu kopieren (dh eine Potenz von zwei für Breite und Höhe). Von da an sah jeder Charakter gut aus, also probierte ich verschiedene Schriftgrößen aus, um zu sehen, ob alles funktionierte. OK, rate mal ... es war bei kleinen Schriftgrößen (dh & lt; 30) nicht jedes Zeichen mit einer kleinen Breite ('l', 'i', ';', ':') tauchte verstümmelt auf.

Ссылка

Alle verzerrten Zeichen hatten eine Breite von 1, was zu zweien kam, denn das ist die erste Potenz von Zwei, hier ist der Code zum Rendern jedes Zeichens.

%Vor%

Die einzige Lösung, die ich finden konnte, war eine kleine if-Anweisung, die TextureWidth auf 4 änderte, wenn sie den Wert 2 hat, und so sieht der Text in jeder Schriftgröße gut aus. Aber das macht für mich keinen Sinn, warum würde OpenGL die Breite von 2 Texturen ablehnen? Oh, und ich habe festgestellt, dass das Problem nicht im Puffer liegt, ich habe es ausgedruckt und es sieht gut aus.

Können Sie sich irgendeinen Grund vorstellen, warum das passiert?

Hier ist der Rest des (extrem) chaotischen Codes, falls das Problem nicht in der Render-Funktion liegt.

%Vor%

Ich denke, das ist alles, bitte lassen Sie es mich wissen, wenn Sie das Problem gefunden haben.

Beste Grüße und Dank im Voraus,

    
Carlos 27.10.2010, 17:02
quelle

4 Antworten

15

Ich wette, ich bin letzte Woche genau über dasselbe Problem mit FreeType und OpenGL gestolpert.

OpenGL-Standard berücksichtigt, dass Texturdatenzeilen an 4-Byte-Grenzen ausgerichtet sind. Dies führt zu Problemen, wenn die Texturbreite 2 oder 1 wird, was gültige Power-of-2-Größen sind.

Wird das Problem behoben, wenn Sie die Zeilenausrichtung auf 1 Byte begrenzen? Verwenden Sie

%Vor%

HTH

    
rotoglup 29.10.2010 22:46
quelle
0

Bereiten Sie sich darauf vor, & 256 Zeichen zu unterstützen (Das ist Geschichte) und Textfluss von rechts nach links und von links nach rechts sowie von oben nach unten.

Nur ein anderer Themenhinweis für Englischsprachige.

    
RobKop 29.10.2010 08:28
quelle
0

Sie haben wahrscheinlich ein Problem mit der Texturumhüllung festgestellt.

Die Pixel, die an einem Rand der Textur gerendert werden, werden in OpenGls auf die andere Seite "geblättert" und versuchen, die Textur zu kacheln. korrekt. Wenn ich richtig bin, ändern Sie die Wrapping-Parameter in

%Vor%

sollte opengl Ihre Textur an den Rändern klemmen und Ihre kleinen Texturen korrekt zeichnen.

Aktualisieren

Ich habe etwas auf einer Tutorial-Seite gefunden:

  

Wenn Bitmaps einer kleinen Schriftart nicht vorhanden sind   mit den Bildschirmpixeln ausgerichtet,   bilineare Interpolation verursacht   Artefakte. Eine einfache Lösung dafür ist es   Ändern Sie die Interpolationsmethode von   GL_LINEAR zu GL_NEAREST, obwohl dies   kann zu zusätzlichen Artefakten führen   der Fall von gedrehtem Text. (Wenn es rotiert   Text ist dir wichtig, du magst es   Versuchen Sie OpenGL zu Super Sample zu sagen   von größeren Schriftarten-Bitmaps.)

    
sum1stolemyname 28.10.2010 10:03
quelle
0

Verwenden Sie Freetype mit ICU. Freetype allein kann die Glyphen nicht richtig darstellen. Verwenden Sie dafür die Intensivstation.

    
seereddi sekhar 23.06.2016 11:07
quelle

Tags und Links