Рендеринг шрифтов FreeType

Я пытался визуализировать шрифты FreeType2 в OpenGL 3. Я использовал учебник NeHe http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/ . Тем не менее, я немного изменил его для современного OpenGL 3+. На самом деле, я использую glBufferData (…, GL_DYNAMIC_DRAW), чтобы обновить буфер вершин для каждого символа. Массивы вершин создаются во время загрузки глифа, как это делает NeHe со списками отображения:

    int width = next_p2(bitmap.width);
int height = next_p2(bitmap.rows);

float   x=(float)bitmap.width / (float)width,
y= (float)bitmap.rows / (float)height;using namespace glm;
glyphsVertices[c] = new pxgVertex2dT[4];
glyphsVertices[c][0] = {  vec2(0,bitmap.rows), vec2(0,y) };
glyphsVertices[c][1] = {  vec2(0,0), vec2(0,0) };
glyphsVertices[c][2] = {  vec2(bitmap.width,0), vec2(x,0) };
glyphsVertices[c][3] = {  vec2(bitmap.width,bitmap.rows), vec2(x,y) };

Где glyphVertices — это двумерный массив такой структуры:

   struct Vertex2dT
{
glm::vec2 pos;
glm::vec2 texCoord;
};

К сожалению, я получаю следующий результат:

Результат кода

Итак, что я делаю не так?

1

Решение

Происходят две вещи: ваш код предполагает происхождение области просмотра в верхнем левом углу, в то время как в действительности он находится в левом нижнем углу, что означает, что ваше изображение перевернуто вертикально.

FreeType также отображает изображения глифов с началом координат в верхнем левом углу, которое противостоит повороту геометрии по оси y, поэтому символы выглядят вертикально.

1

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

Как правильно указал SAKrisT, проблема была вызвана неправильным смещением по оси Y. Поиграв немного с кодом, я разобрался с решением:

   if(FT_Load_Char(face, c, FT_LOAD_RENDER))
return;

FT_GlyphSlot g = face->glyph;

int width = next_p2(g->bitmap.width);
int height = next_p2(g->bitmap.rows);

...

float   x=(float)g->bitmap.width / (float)width,
y= (float)g->bitmap.rows / (float)height;float x2 = g->bitmap_left;
float y2 = g->bitmap_top;
float w = g->bitmap.width;
float h = g->bitmap.rows;using namespace glm;
glyphsVertices[c] = new pxgVertex2dT[4];
glyphsVertices[c][0] = {  vec2(0,h-y2), vec2(0,y) };
glyphsVertices[c][1] = {  vec2(0,-y2), vec2(0,0) };
glyphsVertices[c][2] = {  vec2(w,-y2), vec2(x,0) };
glyphsVertices[c][3] = {  vec2(w,h-y2), vec2(x,y) };

Теперь это работает отлично!

1

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