1
我在我的OpenGL程序中使用FreeType2
庫進行文本渲染。我有一個用於屏幕rgb值的緩衝區數組。對於文本渲染,我首先初始化FreeType2庫,然後加載字體,設置像素大小,然後獲取A
char,然後獲得該字形的位圖,合併字形位圖和我的緩衝區數組,然後使用glTexSubImage2D
函數和渲染。我得到了這個結果。FreeType2多個字符和隨機顏色
我對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);
什麼是錯我的代碼?
哇。它工作,但我不明白它是如何完成的。你能解釋你是怎麼做的嗎? – Stradivarius
您的計算使用'(yy * bmp.width + xx)* 3'作爲偏移量,因爲您認爲'bmp'是RGB每像素3個字節並且緊密堆放在內存中的行。實際情況是'bmp'是一個灰度圖像,每個像素1個字節,行之間有'bmp.pitch'個字節。因此,以上計算'yy * bmp.pitch + xx'是正確的。 – ybungalobill