渲染Freetype2字体

梦想游戏人
目录:
OpenGL

将字符串的每个字 通过freetype 获得bitmap 然后渲染至GL

下面 Lite2D ::Text 的实现

CharBitMap *Text::getCharBitMapData(unsigned short _char)
{
	CharBitMap *bitmap = new CharBitMap;




	FT_Set_Pixel_Sizes(face, _fontsize, _fontsize);
	//FT_Set_Char_Size(face, 2*64, 2*64, 900, 900);

	auto _index = FT_Get_Char_Index(face, _char);
	auto _glyph = FT_Load_Glyph(face, _index, FT_LOAD_DEFAULT);


	


	FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
	FT_Bitmap&bitmap1 = face->glyph->bitmap;



	int width = bitmap1.width;
	int height = bitmap1.rows;

	char* data1 = new char[width*height * 4];
	//	memset(data1, 0, width*height * 4);


	//make a bitmap
	for (int j = 0; j < height; j++)
	{
		for (int i = 0; i < width; i++)
		{
			unsigned char _value = (i >= bitmap1.width || j >= bitmap1.rows) ? 0x0 :
				bitmap1.buffer[i + bitmap1.width*j];

			//R G B A
			data1[(4 * i + (height - j - 1) * width * 4)] = _color3b.r;  //R
			data1[(4 * i + (height - j - 1) * width * 4) + 1] = _color3b.g; // G
			data1[(4 * i + (height - j - 1) * width * 4) + 2] = _color3b.b;//B
			data1[(4 * i + (height - j - 1) * width * 4) + 3] =  _value; //A
		}
	}
	


	//memset(data1, 0xf0, width );

	//	memcpy(data1, bitmap1.buffer, width*height * 4);






	bitmap->data = data1;
	bitmap->height = height;
	bitmap->width = width;
	bitmap->size = width*height * 4;
	bitmap->_char = _char;

	//deal with ' '
	if (_char == 32)
	{
		bitmap->width = _fontsize / 2.0f;
	}


 	log1(" char %d   %d %d", _char, width, height);
// 
// 

	glGenTextures(1, &bitmap->texture_id);

	glBindTexture(GL_TEXTURE_2D, bitmap->texture_id);


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




	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);


	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->width, bitmap->height, 0,
		GL_RGBA, GL_UNSIGNED_BYTE, bitmap->data);
	//glBindTexture(GL_TEXTURE_2D, bitmap->texture_id);


	return bitmap;

}
Scroll Up