在按照一些例子如何渲染like this one后,我想我可能需要某种形式的缓存。虽然我的缓存正常,但我很难获得正确的字形前进值。
以下代码足以证明函数FT_Get_Glyph
将使值不同。 (find / -name FreeSans.ttf
或link如果您需要复制/下载字体
#include <iostream>
#include <map>
#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <freetype2/ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
int main() {
std::map<GLchar, FT_BitmapGlyph> glyphs;
FT_Library ftLibrary;
FT_Face ftFace;
if (FT_Init_FreeType(&ftLibrary)) {
printf("Could not initialize FreeType library\n");
return GL_TRUE;
}
if (FT_New_Face(ftLibrary, "FreeSans.ttf", 0, &ftFace)) {
printf("Could not load selected font\n");
return GL_TRUE;
}
FT_Set_Pixel_Sizes(ftFace, 0, 48);
for (GLubyte c = 0; c < 128; c++) {
if (FT_Load_Char(ftFace, c, FT_LOAD_RENDER)) {
printf("Could not load character, continuing\n");
continue;
}
printf("Advance: %li\n", ftFace->glyph->advance.x >> 6);
if (FT_Get_Glyph(ftFace->glyph, (FT_Glyph *)&glyphs[c])) {
printf("Could not copy the glyph\n");
continue;
}
printf("Advance after get: %li\n", glyphs[c]->root.advance.x >> 6);
printf("Advance after with cast: %li\n", ((FT_Glyph)glyphs[c])->advance.x >> 6);
if (glyphs[c]->root.format == FT_GLYPH_FORMAT_BITMAP) {
printf("Format is bitmap!\n");
}
}
FT_Done_Face(ftFace);
FT_Done_FreeType(ftLibrary);
}
输出
Advance: 16
Advance after get: 16384
Advance after with cast: 16384
Format is bitmap!
Advance: 28
Advance after get: 28672
Advance after with cast: 28672
Format is bitmap!
Advance: 34
Advance after get: 34816
Advance after with cast: 34816
Format is bitmap!
Freetype自己在参考手册link中写下这个:
如果有,可以将FT_Glyph类型转换为FT_BitmapGlyph 'glyph-&gt; format == FT_GLYPH_FORMAT_BITMAP'。这可以让你访问 位图的内容很容易。
这是关于根域的:
根FT_Glyph字段。
至少对我来说,我应该可以通过FT_Glyph
访问->root
的原始字段。
显然这不起作用,所以我的问题是,我误解了什么吗?
所以,当我研究这个问题的信息时,我偶然发现了这些信息,link
因为'* aglyph-&gt; advance.x'和&#39; * aglyph-&gt; advance.y&#39;是16.16 定点数,'slot-&gt; advance.x'和'slot-&gt; advance.y'(其中 以26.6定点格式)必须在[-32768; 32768 [。
]范围内
由于glyphs[c]->root.advance.x >> 16 == ftFace->glyph->advance.x >> 6
我可以在16:16和26:6之间看到一些联系,尽管这些数字还没有说明我的任何内容。
有人可以解释这是如何累加的吗?为什么改变比率(或者这些数字是什么)并且我理解正确的FT_Get_Glyph
glyphs[c]->root.advance.x >> 16
之后访问高级值的正确方法是正确的?
(我意识到我可能在很大程度上回答了我自己的问题,但由于我没有找到任何有关此问题的信息/问题,我认为无论如何我会发布它作为对其他人的参考)