本文参考NeHe第13课图像字体,大致三步:
- 创建字体
- 输出打印
- 删除字体
1. 创建字体的函数:
/*
* BuildFont
* 创建位图字体
*/
GLvoid BuildFont(GLvoid)
{
HFONT font; // 字体句柄
HFONT oldfont;
base = glGenLists(256); // 创建96个显示列表
font = CreateFont(-24, // 字体高度
0, // 字体宽度
0, // 字体的旋转角度
0, // 字体底线的旋转角度
FW_BOLD,// 字体重量
FALSE, // 是否使用斜体
FALSE, // 是否使用下划线
FALSE, // 是否使用删除线
ANSI_CHARSET, // 设置字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 剪裁精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH,
"Courier New"); // 字体名称
oldfont = (HFONT)SelectObject(hDC, font); // 选择我们需要的字体
wglUseFontBitmaps(hDC, 0, 256, base); // 创建96个显示列表,绘制从ASCII码为32-128的字符
SelectObject(hDC, oldfont);
DeleteObject(font);
}
其中base是一个全局变量
GLuint base; // 绘制字体的显示列表的开始位置
2. 打印函数
这里定义了一个类似C语言printf的一个参数可变的函数,需要stdarg.h文件:
/*
* glPrint
* 自定义GL输出函数
*/
GLvoid glPrint(const char *fmt, ...)
{
char text[256]; // 保存字符串
va_list ap; // 指向一个变量列表的指针
if (fmt == NULL)
return;
va_start(ap, fmt); // 分析可变参数
vsprintf(text, fmt, ap); // 把参数值写入字符串
va_end(ap);
glPushAttrib(GL_LIST_BIT); // 把显示列表属性压入属性堆栈
glListBase(base - 0); // 设置显示列表的基础值
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // 调用显示列表绘制字符串
glPopAttrib(); // 弹出属性堆栈
}
3. 删除字体
/*
* KillFont
* 删除显示列表
*/
GLvoid KillFont(GLvoid)
{
glDeleteLists(base, 256);
}
在InitGL()中添加创建字体的代码:
BuildFont();
在DrawGLScene()中添加代码:
glTranslatef(0.0f, 0.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f); // 颜色
glRasterPos2f(-0.4f, 0.30f); // 输出位置
glPrint("Active OpenGL Text With NeHe - %7.2f", cnt1); // 输出文字到屏幕
在KillGLWindow()中添加删除字体的代码:
KillFont(); // 删除字体