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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ithewei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值