FreeType生成不对称字形

时间:2016-12-29 23:11:36

标签: c++ opengl freetype

所以我试图在我的图形引擎中使用带符号的距离字段实现字体渲染。

为此,我使用FreeType库生成所有字母的字形。具体来说,我正在尝试加载这样的单色位图:

FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO)

然后我从字形缓冲区中提取所有位并将其放入单色黑白纹理中,我可以在屏幕上显示以进行测试。

我的代码用于提取位并将其放入字节数组中:

FT_Bitmap bm = face->glyph->bitmap;

FT_Bitmap mono;
FT_Bitmap_New(&mono);
//convert from 8 pixel per byte to 1 pixel per byte
FT_Bitmap_Convert(ft, &bm, &mono, 1);
//set each byte from 0/1 to 0/255
for (int y = 0; y < mono.rows; y++) {
    for (int x = 0; x < mono.width; x++) {
        mono.buffer[y * mono.width + x] *= 255;
    }
}

我的问题是,FreeType产生的字形似乎是不对称的。

例如,这是字母M,字体pixelsize为64,使用字体OpenSans-Regular:

enter image description here

这是字母M,其字体大小为1024:

enter image description here

我尝试过多种字体,多种字体等等,某些字形始终保持不对称。 另请注意,我手动读取纹理像素数据以验证OpenGL的纹理缩放或任何不会导致错误。

关于为什么FreeType似乎会产生不对称字形的任何想法,或者有人可以告诉我在以后渲染文本时这是否会出现问题?

编辑:我现在使用库函数提取位,因此错误必须在FreeType中。

1 个答案:

答案 0 :(得分:1)

你在这里假设OpenSans是一种所有glpyhs都是对称的字体。情况并非如此,也不是FreeType错误。您始终可以向freetype列表发送电子邮件,但可能会给出相同的答案。

这不是一个不准确的原因,因为无论出于何种原因,字体设计师都不是通过对称设计M字形。很多时候,这样做是为了提高可读性。稍微不对称将导致暗示引擎以略微不同的方式光栅化字形,这将更清晰或看起来更“清脆”。以下是一些屏幕截图,以证明情况属实。

首先,这是Windows 10 / Chrome 55的大幅放大屏幕截图,在浏览器中呈现字形,网站允许我选择的最小尺寸。虽然乍看之下看起来确实是对称的,但事实并非如此。

Chrome 55 screenshot

其次,我下载了字体并在FontForge中打开它。如果你仔细观察,你会发现两边内边缘的曲线实际上略有不同。我还花了一点时间来看看定义M的底部中心的两个点。它们的位置是(848,0)和(985,0)。这两个点之间的中点是(916.5,0),但是定义该部分字形顶边的两个点是(920,256)和(928,256)。这稍微向右移动。

FontForge screenshot

如果您正在寻找对称或其他简单字体,请查找面向程序员或控制台字体的字体。 Arial,Consolas,Courier New等可能很适合这项法案。