Шрифт плохо отрисован с помощью freetype и Opengl ES 2 (устройство iPhone) - PullRequest
0 голосов
/ 01 октября 2011

Я использую 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 Ответ

1 голос
/ 02 октября 2011

В произвольном формате: 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);
...