我正在使用freetype在iPhone设备中编写文本,结果很少见。正如您在图像中看到的那样,相同的字符(如'b','n'或'u')不会被平等渲染。
纹理始终相同。知道问题在哪里或者发生了什么?
http://craneossgd.files.wordpress.com/2011/10/image_freetype1.png
代码:
FT_New_Face(getFTLibrary(), _filename, 0, &(_face))
FT_Select_Charmap( _face, FT_ENCODING_UNICODE );
FT_Set_Char_Size( _face, _pt<<6,_pt<<6, _dpi, _dpi);
for (i=0; i<255; i++)
{
if (!createGlyphTexture(i))
{
clean();
}
}
.....
createGlyphTexture(unsigned char ch){
....
FT_Load_Glyph(_face, FT_Get_Char_Index(_face,ch), FT_LOAD_DEFAULT)
FT_Get_Glyph(_face->glyph, &glyph)
....
// *** Transform glyph to bitmap
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
// *** Get bitmap and glyph data
bitmap_glyph = (FT_BitmapGlyph)glyph;
bitmap = bitmap_glyph->bitmap;
// ***
width = pow2(bitmap.width);
height = pow2(bitmap.rows);
// *** Alloc memory for texture
expanded_data = (GLubyte *)malloc( sizeof(GLubyte)*2*width*height );
for (j=0; j<height;j++)
{
for (i=0; i<width; i++)
{
if ( (i>=(CRuint)bitmap.width) || (j>=(CRuint)bitmap.rows) ){
expanded_data[2*(i+j*width)] = 0;
expanded_data[2*(i+j*width)+1] = 0;
} else {
expanded_data[2*(i+j*width)] = bitmap.buffer[i+bitmap.width*j];
expanded_data[2*(i+j*width)+1] = bitmap.buffer[i+bitmap.width*j];
}
}
}
// *** Load texture into memory
glBindTexture(GL_TEXTURE_2D, _textures[ch]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_LUMINANCE_ALPHA, width, height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, expanded_data);
....
}
谢谢!
答案 0 :(得分:1)
在freetype引用中: http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html
<强> FT_LOAD_TARGET_LIGHT 即可。 用于非单色模式的较轻提示算法。许多生成的字形更模糊,但更像其原始形状。有点像在Mac OS X上渲染。作为特殊例外,此目标意味着FT_LOAD_FORCE_AUTOHINT。
FT_RENDER_MODE_LIGHT 。这相当于FT_RENDER_MODE_NORMAL。它仅被定义为单独的值,因为渲染模式也间接用于定义提示算法选择器。有关详细信息,请参阅FT_LOAD_TARGET_XXX。
使用下一个配置:
FT_Load_Glyph(_face, FT_Get_Char_Index(_face,ch), FT_LOAD_TARGET_LIGHT)
...
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);