OpenGL学习笔记--字体库freetype2、FTGL

freetype2

FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。

FTGL

FTGL即FreeType Graphics Library,它相当于在freetype的基础上又封装了一道接口,更加方便使用。

下载编译

分别到各自官网上下载即可,如果是ubuntu下可直接使用apt-cache search搜索相关的安装包,进行安装,windows下下载源代码后使用VC打开对应工程编译即可,没有提供VC工程的,一般也会提供cmake文件去生成。
注意的是因为FTGL是依赖于freetype的,所以需要先编译好freetype2,并在VC目录中添加头文件和库文件路径

FTGL使用基本流程图

Created with Raphaël 2.1.0 开始 构造字体对象 FTGLPixmapFont* pFont = new FTGLPixmapFont 设置字高 pFont- >FaceSize 设置字符集 pFont- >CharMap 绘画字符串 pFont- >Render 析构字体对象 delete pFont 结束

代码示例

#include <gl/glut.h>

#include <freetype2/ft2build.h>
#include <freetype2/freetype/freetype.h>
#include <FTGL/ftgl.h>
#include <locale.h>

#ifdef WIN32
#pragma comment(lib, "glew32.lib")
#pragma comment(lib, "freeglut.lib")
#pragma comment(lib, "freetype2410.lib")
#pragma comment(lib, "ftgl_static.lib")
#endif

struct DrawInfo{
    int left;
    int right;
    int top;
    int bottom;
    GLuint color;
};

#define R(color) (((color) >> 24) & 0xFF)
#define G(color) (((color) >> 16) & 0xFF)
#define B(color) (((color) >>  8) & 0xFF)

FTGLPixmapFont* pFont = NULL;
void initFont(const char* fname, unsigned int h){
    if (!pFont){
        pFont = new FTGLPixmapFont(fname);
        pFont->FaceSize(h);
        pFont->CharMap(FT_ENCODING_UNICODE);
    }
}

void releaseFont(){
    if (pFont){
        delete pFont;
        pFont = NULL;
    }
}

void drawStr(const char* str, DrawInfo* di){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT), 0.0, -1.0, 1.0);

    const char* mbs = str;
    int len_mbs = strlen(mbs);
    // linux下使用locale -a可以查看支持的本地化字符集,windows下使用chcp命令查看活动代码页
#ifdef WIN32
    setlocale(LC_ALL,".936");
#else 
    setlocale(LC_ALL,"ch_ZN.utf8");
#endif
    int len_wcs = mbstowcs(NULL, mbs, 0);
    wchar_t* wcs = new wchar_t[len_wcs + 1];
    mbstowcs(wcs, mbs, strlen(mbs)+1);

    //windows也可使用MultiByteToWideChar这个API来进行多字节与宽字节的转化

    int r = R(di->color);
    int g = G(di->color);
    int b = B(di->color);
    glColor3ub(R(di->color), G(di->color), B(di->color));
    glRasterPos2i(di->left, di->bottom);
    pFont->Render(wcs);
    glColor3ub(255,255,255);

    delete[] wcs;
}

void reshape(int w, int h){
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, w, h, 0.0, -1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display(){
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    DrawInfo di;
    di.left = 200;
    di.bottom = 200;
    di.color = 0xFFFF00FF;
    drawStr("FTGL使用范例", &di);

    glutSwapBuffers();
}

int main(int argc, char* argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(640, 480);

    int mainwnd = glutCreateWindow("glut window");

    glutReshapeFunc(reshape);
    glutDisplayFunc(display);

    // ttf文件可以到网上下载,windows下也可在C盘直接搜索*.ttf
    initFont("D:/simfang.ttf", 36);

    glutMainLoop();

    releaseFont();

    return 0;
}

效果图:
ftgl

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
FreeType是一个开源的字体渲染库,它提供了一套功能强大的API,用于加载、解析和渲染字体文件。使用FreeType库,您可以在应用程序中实现高质量的字体渲染。 以下是使用FreeType库加载和渲染字体的基本步骤: 1. 下载和安装FreeType库:您可以从FreeType官方网站(https://www.freetype.org)下载库文件,并按照文档进行安装。 2. 引入头文件和链接库:在您的项目中引入FreeType的头文件和链接库。具体的引入方式会根据您使用的编程语言和开发环境而有所不同。 3. 初始化FreeType库:在使用FreeType之前,需要调用FT_Init_FreeType函数来初始化FreeType库。 4. 加载字体文件:使用FT_New_Face函数加载字体文件。您需要提供字体文件的路径,并指定要加载的字体索引(如果字体文件包含多个字体)。 5. 设置字体大小:使用FT_Set_Pixel_Sizes函数或FT_Set_Char_Size函数设置字体的大小。 6. 渲染字符:使用FT_Load_Char函数加载要渲染的字符,并使用FT_Render_Glyph函数将字符渲染为位图。 7. 获取位图数据:通过FT_GlyphSlot结构体中的bitmap成员获取位图数据。 8. 绘制位图:将位图数据绘制到屏幕或纹理上,以实现字体渲染效果。 9. 释放资源:在使用FreeType库后,需要调用相应的清理函数来释放资源,例如FT_Done_Face和FT_Done_FreeType。 请注意,以上仅为使用FreeType库的基本步骤,具体的实现方式会根据您的需求和编程语言而有所不同。您可以参考FreeType库的文档和示例代码,以及相关编程语言的FreeType库绑定或封装库的使用指南,来更详细地了解和应用FreeType库。 希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值