之前基于opengl写了套三维点云网格渲染插件,但不支持字符或汉字的渲染。为了给三坐标轴增加坐标轴名字,因此文字与字符的渲染又被提上了日程。有事找百度,百度的结果是有gltext这样一个库,但gltext需要freetype支持。
对于freetype如何解析字符,gltext如何包装freetype并结合opengl进行字符和汉字绘制的具体技术细节,此处就不进行解释,网上有很多相关的示例。此处只对编译和使用过程中遇到的坑进行说明。
(1)在官网上下的freetype2100,个人编译出来的库有问题,具体是啥问题,不清楚。迫于无奈使用了OSG第三方库中的freetype库。
(2)在使用gltext前一定要对freetype进行测试,保证freetype是正确的。官网上的示例说实话不怎么的,在网上找了一位仁兄的测试示例,引用自https://q.cnblogs.com/q/33583/:
void TestTrueType()
{
FT_Library m_pFTLib;
FT_Face m_pFTFace;
FT_Error error = FT_Init_FreeType(&m_pFTLib);
if (FT_New_Face(m_pFTLib, "C:/WINDOWS/Fonts/simkai.ttf", 0, &m_pFTFace))
{
return;
}
FT_Select_Charmap(m_pFTFace, FT_ENCODING_UNICODE);
FT_Set_Char_Size(m_pFTFace, 0, 12 << 6, 300, 300);
// 此出将"A"改为汉字,则只显示出一个框;
//error = FT_Load_Glyph(m_pFTFace, FT_Get_Char_Index(m_pFTFace, 0x6B66), FT_LOAD_DEFAULT);
// 第二个参数为渲染模式,这里渲染为1位位图(黑白位图),若为FT_RENDER_MODE_NORMAL则渲染为256级灰度图;
error = FT_Load_Char(m_pFTFace, 27494, FT_LOAD_DEFAULT);
error = FT_Render_Glyph(m_pFTFace->glyph, FT_RENDER_MODE_NORMAL);
FT_Bitmap& bmp = m_pFTFace->glyph->bitmap;
int h = bmp.rows;
int w = bmp.width;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if ((bmp.buffer[i * w + j]) == 0) // 有东东;bmp.pitch
{
printf("0");
}
else
{
printf("1");
}
}
printf("\n");
}
}
(3)关于测试代码中提到的中文字符显示的问题,使用wchar_t或者wstring就可以,因为汉字需要两个字节来显示。
(4)另外需要注意的问题是,加载的font字体一定要支持汉字,如arial.ttf是不支持汉字的,所以你无论怎么弄显示的都是一个框。
(5)gltext是老外弄的,老外用的是英文,所以原生的gltext是不支持汉字的,需要更改接口,把char换成wchar_t,然后把里面保存字符个数的256换成常用的汉字的个数就ok了。
下面给出初步实验的效果
本人环境是VS2013编译的x64的库,有需要的小伙伴可以私信和留言。