OpenGL Freetype Text, Y смещение до верхней границы символа

в OpenGL для рисования текста я использую freetype. я успешно обработал текст на данный момент, но у меня все еще есть проблема, когда символы не указывают на правильную координату y (эти символы не плоские).

посмотрите на картинку ниже, я сделал текст «Загрузка …».

введите описание изображения здесь

как вы можете видеть, координаты y были расположены неправильно. это меня смущает.
это код, что я сделал:

class FontBitmap{
private:
struct character_info {
float bw; // bitmap.width;
float bh; // bitmap.rows;
} c[256];
int next_p2 (int a )
{
int rval=1;
while(rval<a) rval<<=1;
return rval;
}
GLuint  texture[256]; //character textures
public:
FT_Library  library;   /* handle to library     */
FT_Face     face;      /* handle to face object */
FontBitmap(){}

void Print(char * str,GLfloat x,GLfloat y){ //the function where to render the text
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glPushMatrix();
glTranslatef(x,y,0.0f);
for(int i = 0;i < strlen(str);i++)
{
glPushMatrix();
glBindTexture(GL_TEXTURE_2D,texture[str[i]]);
glTranslatef(x,0,0);  //the placement of per character
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,0.0f);
glTexCoord2f(1,0);glVertex3f(c[str[i]].bw,0,0.0f);
glTexCoord2f(1,1); glVertex3f(c[str[i]].bw, c[str[i]].bh ,0.0f);
glTexCoord2f(0,1); glVertex3f(0, c[str[i]].bh,0.0f);
glEnd();
x +=c[str[i]].bw;
glPopMatrix();
}
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}

FontBitmap(char * filePath, int size) //the constructor
{
glEnable(GL_TEXTURE_2D);

if (FT_Init_FreeType (&library))
{
//on error
return;
}
if (FT_New_Face(library,filePath,0,&face))
{
//on error
return;
}
FT_Set_Pixel_Sizes (face, 0, size);
for (unsigned long i = 33; i < 256; i++)
{
if(FT_Load_Char(face, i, FT_LOAD_RENDER))
{
//on error;
return;
}
int width = next_p2( face->glyph->bitmap.width );
int height = next_p2( face->glyph->bitmap.rows );

c[i].bw = width;
c[i].bh = height;

GLubyte* expanded_data = new GLubyte[ 2 * width * height];

for(int j=0; j <height;j++) {
for(int i=0; i < width; i++){
expanded_data[2*(i+j*width)]= expanded_data[2*(i+j*width)+1] =
(i>=face->glyph->bitmap.width || j>=face->glyph->bitmap.rows) ?
0 : face->glyph->bitmap.buffer[i + face->glyph->bitmap.width*j];
}
}
glGenTextures(1,&texture[i]);
glBindTexture( GL_TEXTURE_2D, texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height,
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, expanded_data );
delete [] expanded_data;
}

}

};

1

Решение

Ascent и Descent — это две метрики FreeType, которые вас интересуют в отношении вашего вопроса.

Горизонтальный интервал между символами контролируется с помощью Advance и Кернинг

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]