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