我正在编写一个使用freetype2作为文本渲染引擎的opengl程序。
使用它的LCD子像素渲染,我发现渲染结果中总是有一些噪声像素,为什么会发生这种情况?此外,虽然它的手册说LCD模式会生成宽度为3的倍数的缓冲区,但我经常发现宽度为3n + 1或3n + 2,与face->glyph->bitmap->width
不一致。
答案 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库,所以我不能通过个人经验说话,但也许“噪音”是因为你的文字宽度或你左上角文字坐标的计算是一个?