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,
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
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.)
Verwenden Sie Freetype mit ICU. Freetype allein kann die Glyphen nicht richtig darstellen. Verwenden Sie dafür die Intensivstation.