C++ 在freetype上转换glyph时的奇怪转换
我试图做一个简单的文本渲染引擎的一个小游戏,我的工作。我试着学习各种教程,但我始终没有在Y坐标上找到正确的位置 现在,我将学习本教程: 我知道glyph被正确加载,因为我手动检查了它们。 问题是图示符现在看起来像这样: 白色的东西应该是我试图画的字形,但是看起来非常扭曲 我认为问题在于转换,它看起来是这样的:C++ 在freetype上转换glyph时的奇怪转换,c++,opengl,freetype,C++,Opengl,Freetype,我试图做一个简单的文本渲染引擎的一个小游戏,我的工作。我试着学习各种教程,但我始终没有在Y坐标上找到正确的位置 现在,我将学习本教程: 我知道glyph被正确加载,因为我手动检查了它们。 问题是图示符现在看起来像这样: 白色的东西应该是我试图画的字形,但是看起来非常扭曲 我认为问题在于转换,它看起来是这样的: float x2 = x + g->bitmap_left * sx; float y2 = -y - g->bitmap_top * sy; float w = g-&g
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);
因为它看起来不像一个没有旋转的变换,我认为它是旋转字形并以奇怪的方式缩放它们
但是如果我尝试像这样使用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位置不正确
你能给我指一下正确的方向吗
我认为这是因为没有正确使用度量数据来渲染每个glyph。在这种情况下,我认为您需要从每个glyph的边界框中获取“基线” 像这样的东西应该得到它:
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位置。我发现了问题所在,结果发现我理解教程的方式不对,这部分:
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},
};
它不是一个变换,它的真正顶点信息和它的边界如下:
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);
这样,您就可以获得屏幕上的每个glyph,而无需对着色器进行变换