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

2 c++ opengl truetype freetype

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

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

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

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

然后生成一个纹理

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);
Run Code Online (Sandbox Code Playgroud)

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

那么为什么我的TrueType字体在缩放就像位图字体时变得模糊了?

Nic*_*las 5

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

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

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

如果您打算利用TrueType的多分辨率特性,那么您需要以您希望绘制它们的分辨率生成字形.或者您可以使用带符号的距离字体光栅化.