使用freetype和Opengl ES 2(IPhone设备)无法很好地渲染字体

时间:2011-10-01 15:43:38

标签: iphone opengl-es fonts opengl-es-2.0 freetype

我正在使用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);
    ....
}

谢谢!

1 个答案:

答案 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);