为什么freetype的渲染文本总会有一些噪音?

xzh*_*zhu 6 c opengl freetype

我正在编写一个使用freetype2作为文本渲染引擎的opengl程序.

使用它的LCD子像素渲染,我发现渲染结果中总是有一些噪声像素,为什么会发生这种情况?此外,虽然它的手册说LCD模式会产生宽度为3的倍数的缓冲区,我经常发现宽度为3n + 1或3n + 2,与之不一致face->glyph->bitmap->width.

在此输入图像描述

xzh*_*zhu 3

实际上,经过几个小时的尝试和测试,我意识到光栅化字形数据有一些不相关的字节,称为padding. 作为说明,下面的图像是缓冲区中的字形数据:(o/x是有意义的数据,而.是不相关的数据)

  0 1 2 3 4 5 6 7
0 o x o x o x . .
1 x o x o x o . .
2 o x o x o x . .
3 x o x o x o . .
4 o x o x o x . .
Run Code Online (Sandbox Code Playgroud)

有三个数字描述了该缓冲区的大小,前两个数字很明显:

rows = 5    //since there are 5 rows
width = 6   //since each row has 6 bytes of data
Run Code Online (Sandbox Code Playgroud)

然而,实际上还有第三种:

pitch = 8   //the actual width of rows, including "padding"
Run Code Online (Sandbox Code Playgroud)

如果您像我一样忽略缓冲区的这个属性,并错误地认为它width是实际宽度,那么您将渲染扭曲或平移的字形形状。

我对这种“填充”的理解就像 Dhaivat Pandya 所说的那样,这是一种补偿。然而,它不是奇偶校验的补偿,(显然+2并没有改变奇偶校验,)默认情况下,它是使实际宽度成为4的倍数的补偿。但是,是的,你可以将4更改为2甚至1。我猜通过形成宽度为 4 倍数的数据矩阵,可以更快地加载,例如加载到而longint不是byte.

但尽管如此,他的洞察力还是R..给我留下了深刻的印象。我想你们根本无法想象我会犯这么低级的错误。