2011-10-01 101 views
0

我正在使用freetype在iPhone設備中編寫文本,結果很少見。正如你在圖像中看到的那樣,相同的字符(如'b','n'或'u')不會被同等渲染。使用freetype和Opengl ES 2(IPhone設備)不能很好地呈現字體

紋理總是相同的。任何想法在哪裏是問題或發生了什麼?

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

爲什麼您使用的FreeType? – hooleyhoop

+0

我正在開發一款適用於iPhone和Android設備的2D遊戲引擎。我使用的是Freetype,因爲它是跨平臺的。 – cpps

+0

顯示一些代碼。它看起來像freetype配置爲呈現單色位圖,當你想要灰度(FT_RENDER_MODE_MONO),但沒有源代碼,這是不可能說的。 iOS本機類型渲染基於freetype構建,但不需要您自己配置它 – hooleyhoop

回答

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