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

时间:2011-05-22 14:36:59

标签: c opengl freetype

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

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

enter image description here

2 个答案:

答案 0 :(得分: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 . .

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

rows = 5    //since there are 5 rows
width = 6   //since each row has 6 bytes of data

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

pitch = 8   //the actual width of rows, including "padding"

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

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

但是,R..的洞察力确实让我印象深刻。我想你们不能想象我能犯这样一个基本的错误。

答案 1 :(得分:2)

我从来没有使用FreeType库,所以我不能通过个人经验说话,但也许“噪音”是因为你的文字宽度或你左上角文字坐标的计算是一个?