在freetype上转换字形时的奇怪转换

时间:2015-02-11 23:49:05

标签: c++ opengl freetype

我正在尝试为我正在制作的小游戏做一个简单的文本渲染引擎。我试着遵循各种教程,但我从来没有在Y坐标上找到正确的位置。

现在我正在关注本教程: http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

我知道正确加载字形是因为我手动检查了它们。 问题是字形现在看起来像这样: enter image description here

白色的东西应该是我想要绘制的字形,但看起来非常扭曲。

我认为问题出在转型中,如下所示:

float x2 = x + g->bitmap_left * sx;
float y2 = -y - g->bitmap_top * sy;
float w = g->bitmap.width * sx;
float h = g->bitmap.rows * sy;

GLfloat box[4][4] = {
    {x2,     -y2    , 0, 0},
    {x2 + w, -y2    , 1, 0},
    {x2,     -y2 - h, 0, 1},
    {x2 + w, -y2 - h, 1, 1},
};

因为它看起来并不像没有旋转的变换,我认为它会旋转字形并以奇怪的方式缩放它们。

但是如果我尝试像这样使用glm

glm::mat4 MVP(glm::scale(glm::rotate(glm::translate(glm::mat4(1.0f), glm::vec3(x2, y2, 0.0f)), 0.0f, glm::vec3(0.0f, 0.0f, 1.0f)), glm::vec3(w, h, 0.0f)));

字符串看起来几乎正确,但它没有正确的Y位置。

你能指出我正确的方向吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

我认为这是因为您没有正确使用指标数据来呈现每个字形。在这种情况下,我认为你需要得到基线'这是从每个字形的边界框中获取的。

这样的事情应该得到它:

FT_GlyphSlot slot = ftFace->glyph;
FT_Glyph glyph;
FT_Get_Glyph(slot, &glyph);
FT_BBox bbox;
//get dimensions in pixels
FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_TRUNCATE, &bbox);
int baseLine = (int)bbox.yMin;

哦,并将该基线添加到Y位置。

答案 1 :(得分:0)

我发现了什么是错的,原来我是以错误的方式理解教程而且这一部分:

float x2 = x + g->bitmap_left * sx;
float y2 = -y - g->bitmap_top * sy;
float w = g->bitmap.width * sx;
float h = g->bitmap.rows * sy;

GLfloat box[4][4] = {
    {x2,     -y2    , 0, 0},
    {x2 + w, -y2    , 1, 0},
    {x2,     -y2 - h, 0, 1},
    {x2 + w, -y2 - h, 1, 1},
};

它不是一个真正的顶点信息转换,它的界限如下:

glBufferData(GL_ARRAY_BUFFER, sizeof box, box, GL_DYNAMIC_DRAW);

通过这种方式,您可以在屏幕上获取每个字形,而无需在着色器上进行转换。