缩放TrueType字体会导致文本模糊吗?

时间:2018-05-26 17:04:09

标签: c++ opengl true-type-fonts freetype

我正在使用FreeType来呈现文本。有人告诉我,TrueType依赖于数学,因此在缩放像位图字体时不应该模糊。但是,这正是我发生的事情。

我所做的是我首先初始化一个' face'在FreeType中,然后将生成的字形位图存储在纹理中。然后我将该纹理缩放4并渲染它 - 它看起来很模糊!

所以这就是我所做的(大约):

FT_Face face;
if(FT_New_Face(ft, "fonts/arial.ttf", 0, &face))
    std::cout << "Failed to load font\n";

然后生成纹理

unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width,
    face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer);

然后通过在更大的四边形上拉伸纹理来缩放...

那么,为什么我的TrueType字体在缩放时会像位图字体一样变得模糊?

1 个答案:

答案 0 :(得分:5)

位图字体在缩放时变得模糊,因为它们是位图。模糊来自这样的事实:从它们的自然分辨率缩放它们需要发明位图没有的新像素信息。那个&#34;新信息&#34;是模糊的部分。

纹理是位图(或多或少)。因此,当您将True-Type字体转换为纹理时,将变为位图。纹理不能回到创建它们以制造新信息的内容。根据您提供的分辨率,他们拥有您在将数据上传到其中时所拥有的信息。

因此无论纹理如何获取其数据,它都会像位图那样在缩放上表现出来:变得模糊。

如果您打算利用TrueType的多分辨率特性,那么您需要以您希望绘制它们的分辨率生成字形。或者您可以使用signed-distance font rasterization