2014-12-03 190 views
0

我有問題freetype和OpenGL。我只需要在單個紋理上繪製所有加載的符號。這裏是:使用Freetype和OpenGL渲染字體

FT_Init_FreeType(&lib); 
    FT_New_Face(lib, "C:\\verdana.ttf", 0, &face); 
    FT_Set_Pixel_Sizes(face, 0, size); 

    auto ww = 256 * size; 
    auto hh = size; 

    std::vector<unsigned char> buffer(ww * hh, 0); 

    int off = 0; 

    for (int c = 0; c < 256; c++) 
    { 
     FT_UInt GlyphIndex; 

     GlyphIndex = FT_Get_Char_Index(face, c); 

     FT_Load_Char(face, GlyphIndex, FT_LOAD_RENDER); 

     FT_Bitmap bmp = face->glyph->bitmap; 

     int advance = (face->glyph->advance.x >> 6); 
     int bW = bmp.width; 
     int bH = bmp.rows; 

     for (int h = 0; h < bH; ++h) { 
      for (int w = 0; w < bW; ++w) { 

       buffer[h * bW + off + w] = bmp.buffer[w + bW * h]; 
      } 
     } 

     off += advance; 

    } 


    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, ww, hh, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &buffer[0]); 

我嘗試了很多方法來做到這一點。但我得到的是絕對黑色的紋理... 我的代碼有什麼問題?

+0

您是否檢查從FT_Init_FreeType,FT_New_Face等返回的錯誤代碼?另外可能需要調用FT_Set_Char_Size。 – BDL 2014-12-03 11:52:02

+0

我在代碼的任何部分都沒有發現錯誤。我用FT_Set_Pixel_Sizes設置字符大小。 – user3808059 2014-12-03 12:00:17

+0

但是你也不檢查錯誤。每個freetype函數都返回一個值,表示它是成功/失敗的。例如:'error = FT_Init_FreeType(&library); if(error){failed; }' – BDL 2014-12-03 12:33:16

回答

0

hallelujah,我解決了!

這應該是這樣的:

for (int c = 0; c < 256; c++) 
    { 
     FT_UInt GlyphIndex; 

     GlyphIndex = FT_Get_Char_Index(face, c); 

     FT_Load_Char(face, GlyphIndex, FT_LOAD_RENDER); 

     FT_Bitmap bmp = face->glyph->bitmap; 

     int advance = (face->glyph->advance.x >> 6); 
     int bW = bmp.width; 
     int bH = bmp.rows; 

     for (int h = 0; h < bH; ++h) { 
      for (int w = 0; w < bW; ++w) { 

       buffer[h * ww + off + w] = bmp.buffer[w + bW * h]; 
      } 
     } 

     off += advance; 

    } 


    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, ww, hh, 0, GL_RED, GL_UNSIGNED_BYTE, &buffer[0]); 
0

我認爲這個問題是0-255之間的一些值是不可見或可繪製的人物,這就是爲什麼你什麼也得不到。

你應該檢查GlyphIndex:

GlyphIndex = FT_Get_Char_Index(face, c); 
if (!GlyphIndex) continue; 

那麼你可以指望的FreeType畫出人物的休息你。