OpenGL 字体库freetype2、 FTGL

OpenGL视频教程材料:https://pan.baidu.com/s/1muWuuuo1_89AijQRNOcJmg
提取码:xcwn

 

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使用基本流程图

 

OpenGL学习笔记--字体库freetype2、FTGL_#endif

代码示例
#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;
}

效果图

OpenGL学习笔记--字体库freetype2、FTGL_#endif_02

————————————————
版权声明:本文为博主「ithewei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。