我正在使用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字体在缩放时会像位图字体一样变得模糊?
答案 0 :(得分:5)
位图字体在缩放时变得模糊,因为它们是位图。模糊来自这样的事实:从它们的自然分辨率缩放它们需要发明位图没有的新像素信息。那个&#34;新信息&#34;是模糊的部分。
纹理是位图(或多或少)。因此,当您将True-Type字体转换为纹理时,将变为位图。纹理不能回到创建它们以制造新信息的内容。根据您提供的分辨率,他们拥有您在将数据上传到其中时所拥有的信息。
因此无论纹理如何获取其数据,它都会像位图那样在缩放上表现出来:变得模糊。
如果您打算利用TrueType的多分辨率特性,那么您需要以您希望绘制它们的分辨率生成字形。或者您可以使用signed-distance font rasterization。