Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在freetype上转换glyph时的奇怪转换_C++_Opengl_Freetype - Fatal编程技术网

C++ 在freetype上转换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

我试图做一个简单的文本渲染引擎的一个小游戏,我的工作。我试着学习各种教程,但我始终没有在Y坐标上找到正确的位置

现在,我将学习本教程:

我知道glyph被正确加载,因为我手动检查了它们。 问题是图示符现在看起来像这样:

白色的东西应该是我试图画的字形,但是看起来非常扭曲

我认为问题在于转换,它看起来是这样的:

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,而无需对着色器进行变换