所以我试图在我的图形引擎中使用带符号的距离字段实现字体渲染。
为此,我使用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:
这是字母M,其字体大小为1024:
我尝试过多种字体,多种字体等等,某些字形始终保持不对称。 另请注意,我手动读取纹理像素数据以验证OpenGL的纹理缩放或任何不会导致错误。
关于为什么FreeType似乎会产生不对称字形的任何想法,或者有人可以告诉我在以后渲染文本时这是否会出现问题?
编辑:我现在使用库函数提取位,因此错误必须在FreeType中。
答案 0 :(得分:1)
你在这里假设OpenSans是一种所有glpyhs都是对称的字体。情况并非如此,也不是FreeType错误。您始终可以向freetype列表发送电子邮件,但可能会给出相同的答案。
这不是一个不准确的原因,因为无论出于何种原因,字体设计师都不是通过对称设计M字形。很多时候,这样做是为了提高可读性。稍微不对称将导致暗示引擎以略微不同的方式光栅化字形,这将更清晰或看起来更“清脆”。以下是一些屏幕截图,以证明情况属实。
首先,这是Windows 10 / Chrome 55的大幅放大屏幕截图,在浏览器中呈现字形,网站允许我选择的最小尺寸。虽然乍看之下看起来确实是对称的,但事实并非如此。
其次,我下载了字体并在FontForge中打开它。如果你仔细观察,你会发现两边内边缘的曲线实际上略有不同。我还花了一点时间来看看定义M的底部中心的两个点。它们的位置是(848,0)和(985,0)。这两个点之间的中点是(916.5,0),但是定义该部分字形顶边的两个点是(920,256)和(928,256)。这稍微向右移动。
如果您正在寻找对称或其他简单字体,请查找面向程序员或控制台字体的字体。 Arial,Consolas,Courier New等可能很适合这项法案。