J'ai essayé de développer un simple moteur de jeu 2D et j'ai besoin de pouvoir dessiner du texte, j'ai donc décidé d'utiliser la célèbre bibliothèque FreeType. Mon objectif actuel est de rendre chaque personnage de 0 à 255 et de stocker les informations appropriées dans un objet glyphe, des positions supérieure et gauche du caractère, de la largeur et de la hauteur et une texture opengl. (À l'avenir, je souhaite supprimer avoir 1 texture par glyphe, mais avant de commencer à travailler à ce que j'ai besoin de mes personnages pour afficher correctement). Tout d'abord, j'ai eu tous les personnages brassés, mais j'ai vérifié Cette question et j'ai compris que j'avais Pour copier le tampon bitmap en une nouvelle avec des tailles de texture requises OpenGL (c'est-à-dire une puissance de deux pour la largeur et la hauteur). À partir de là, chaque personnage avait l'air super, j'ai donc essayé de différentes tailles de police pour voir si tout se déroulait bien, devinez quoi ... ce n'était pas, sur de petites tailles de police ( http://img17.imageshack.us/img17/2963/helloworld.png p>
Tous les personnages déformés avaient une largeur de 1, qui est sortie deux, parce que c'est le premier Puissance de deux, voici le code de rendu chaque caractère. p> La seule solution que je pouvais trouver était un peu si la déclaration, modifiant le TextureWidth sur 4 s'il a la valeur de 2, et ainsi, le texte a l'air bien dans toutes les formes de police. Mais cela n'a aucun sens pour moi, pourquoi ouvrirait la largeur de 2 textures? Oh, et j'ai déterminé que le problème ne se trouve pas dans le tampon, je l'ai imprimé et ça a l'air bien. P> Pouvez-vous penser à une raison pour laquelle cela se produit? P> Voici le reste du code (extrêmement) désordonné, au cas où le problème ne se trouve pas dans la fonction de rendu. P> int NextP2(int Val)
{
int RVal = 2;
while(RVal < Val) RVal <<= 1;
return RVal;
}
class Texture
{
public:
void Free() { glDeleteTextures(1, &mHandle); }
void SetHandle(GLuint Handle) { mHandle = Handle; }
void SetWidth(int Width) { mWidth = Width; }
void SetHeight(int Height) { mHeight = Height; }
inline GLuint Handle() const { return mHandle; }
inline int Width() const { return mWidth; }
inline int Height() const { return mHeight; }
private:
GLuint mHandle;
int mWidth;
int mHeight;
};
class Glyph
{
public:
void SetAdvance(int Advance) { mAdvance = Advance; }
void SetLeftTop(int Left, int Top) { mLeft = Left; mTop = Top; }
void SetTexture(Texture texture) { mTexture = texture; }
Texture & GetTexture() { return mTexture; }
int GetAdvance() const { return mAdvance; }
int GetLeft() const { return mLeft; }
int GetTop() const { return mTop; }
private:
int mAdvance;
int mLeft;
int mTop;
Texture mTexture;
};
class Font
{
public:
~Font() { for(int i = 0; i < 256; ++i) mGlyphs[i].GetTexture().Free(); }
bool Load(const std::string & File);
bool Render(int PixelSize);
Glyph & GetGlyph(unsigned char CharCode) { return mGlyphs[CharCode]; }
private:
FT_Face mFace;
Glyph mGlyphs[256];
};
4 Réponses :
Vous avez probablement couru dans un problème d'emballage de texture.
Les pixels rendus sur une bordure de votre texture "saignent" de l'autre côté de OpenGLs tenter de daller la texture. correctement. Si je suis correct, changeez que vous enveloppez les paramètres sur P>
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
J'ai peur que cela ne fonctionnait pas. Tout reste la même chose. Avez-vous vérifié l'écran d'impression? Cela ne ressemble pas à une texture carrelée pour moi. Ils semblent comme des valeurs de pixels aléatoires et je ne sais pas pourquoi ils se présentent là-bas, car même non le tampon est censé être aussi grand. C'est vraiment frustrant ... ça n'a rien de sens! Pourquoi les petits caractères de largeur échouent-ils tandis que d'autres n'ont aucun problème? J'ai traversé mon code encore et encore, et rien ne semble faux, le bitmap est rendu correctement et donc mon texturebuffer ... Toute autre pensée?
En fait, j'avais trébuché sur ce tutoriel lors de la recherche d'une solution à cette question, le changement de gl_nearest n'a rien fait ... mais merci pour votre temps :)
Préparez-vous à soutenir> 256 caractères (c'est l'histoire) et le flux de texte de droite à gauche et à gauche ainsi que le flux de recul. p>
juste un indice de sujet différent pour les anglophones. P>
Merci, mais je ne vis que le soutien de l'Unicode pour le moment. Ceci est censé être un petit projet de brassage domestique, pas une bibliothèque de rendu de texte à usage général. :)
Je parie que je suis tombé sur le même problème avec FreeType et OpenGL la semaine dernière.
OpenGL par défaut consiste à considérer que les lignes de données de texture sont alignées sur 4 limites d'octets. Cela provoque des problèmes lorsque la largeur de la texture devient 2 ou 1 qui sont des tailles de puissance valides de 2. p>
définit l'alignement de la ligne sur 1 limites d'octets corrige votre problème? En utilisant p> hth p> p>
Afin de ne pas laisser cette question «sans réponse», vous devriez peut-être «accepter» cette réponse :)
Utilisez Freeetype avec ICU. Freeterype seul ne peut pas rendre les glyphes correctement. Utilisez l'ICU pour cela. P>
Avez-vous essayé de courir ceci sur un autre ordinateur? Cela pourrait être un problème de pilote.
Non, je n'ai pas, je vais essayer cela et poster plus tard. Merci pour l'idée! :)