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

来源:互联网 发布:极品网络女神sally 编辑:程序博客网 时间:2024/06/05 16:08

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")#endifstruct 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