opengl 使用gltext绘制汉字

之前基于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的库,有需要的小伙伴可以私信和留言。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值