2017-07-15 19 views
1

私はOpenGLプログラムでテキストレンダリングのためにFreeType2ライブラリを使用しています。私は画面のrgb値のバッファ配列を持っています。テキストレンダリングでは、最初にFreeType2ライブラリを初期化し、フォントをロードしてピクセルサイズを設定してA charを取得し、グリフのビットマップを取得し、グリフビットマップとバッファ配列をマージしてglTexSubImage2D関数とレンダリングを使用します。そして、私はこの結果を得た。FreeType2複数の文字とランダムな色

Render result

マイfreetype2のコードです:

assert(FT_Init_FreeType(&console->library) == 0); 
assert(FT_New_Face(console->library, "data/pixelize.ttf", 0, &console->face) == 0); 

assert(FT_Set_Pixel_Sizes(console->face, 0, 32) == 0); 

FT_UInt glyphIndex; 
glyphIndex = FT_Get_Char_Index(console->face, 'A'); 

assert(FT_Load_Glyph(console->face, glyphIndex, FT_LOAD_DEFAULT) == 0); 
assert(FT_Render_Glyph(console->face->glyph, FT_RENDER_MODE_NORMAL) == 0); 

FT_Bitmap bmp = console->face->glyph->bitmap; 
_tpCopyTextToConsoleBuffer(console, bmp, 10, 10); 

そして_tpCopyTextToConsoleBuffer方法は、私のコードが間違っている何

int bitmapWidth = bmp.width; 
int bitmapHeight = bmp.rows; 

int cbx = x; // x 
int cby = y; 

for(int yy = 0; yy < bitmapHeight; yy++) { 
    for(int xx = 0; xx < bitmapWidth; xx++) { 
     int cbIndex = _tpGetIndex(console, cbx, cby); 
     int bmpIndex = (yy * bitmapWidth + xx) * 3; 

     console->buffer[cbIndex] = bmp.buffer[bmpIndex]; 
     console->buffer[cbIndex + 1] = bmp.buffer[bmpIndex + 1]; 
     console->buffer[cbIndex + 2] = bmp.buffer[bmpIndex + 2]; 

     cbx++; 
    } 
    cbx = x; 
    cby++; 
} 

_tpUpdateTexture(console); 

のですか?

答えて

3

FT_RENDER_MODE_NORMALモードは、8ビットのグレースケール画像をラスタライズします。したがって、あなたはRGBの使用にそれを変換する場合:あなたはNDEBUGスイッチでassert Sをオフにした場合、その後の機能はまったく呼び出されませんので

for(int yy = 0; yy < bmp.rows; yy++) { 
    for(int xx = 0; xx < bmp.width; xx++) { 
     uint8_t *p = console->buffer + _tpGetIndex(console, x + xx, y + yy); 
     const uint8_t *q = bmp.buffer + yy * bmp.pitch + xx; 
     p[0] = p[1] = p[2] = *q; 
    } 
} 

は、assert(f() == 0)構文を使用しても避けてください。

+0

うわー。それは働いたが、私はそれがどのように行われたのか分からなかった。あなたはどうやって説明していただけますか? – Stradivarius

+1

あなたの計算では、ピクセルごとに3バイトで、メモリにしっかりとパックされた行を持つRGBであると仮定しているので、オフセットに '(yy * bmp.width + xx)* 3'を使います。現実には、 'bmp'はグレースケールイメージであり、ピクセル当たり1バイト、行間には' bmp.pitch'バイトがあります。したがって、上記のyy * bmp.pitch + xxの計算は正しいものです。 – ybungalobill

関連する問題