第13课 位图字体(Bitmap Fonts)
欢迎进入新的一课。这次我将会教你们使用位图字体( Bitmap Fonts),你可能会对自己说过:“把文本输出到屏幕上好难啊”。如果你尝试过,就会知道那并不是想象中那么容易。
当然,你可以运行一个图形编辑器,把文本输入并保存为图象,然后再把图象加载到OpenGL的程序中去,然后把混合打开,让文体输出到屏幕。但是这是非常耗时的,而且最后的结果可能看起来模糊或是成块,这取决于你使用哪种滤波,除非你的图象有alpha通道,一旦它被映射到屏幕上,你的文本就可以和屏幕上的物体混合起来。
如果你使用过Wordpad, Microsoft Word或是其它文字处理软件,你会注意到各种不同的类型的字体(Fonts)都可以使用。这课就将教你怎样在你自己的OpenGL程序里使用这些字体。实际上,你在计算机中安装的任何一种字体都可以在你的demo中使用。
Bitmap Font不仅可以比图形化后的纹理字体好100倍,而且你可以任意改变文本。而且不需要特地为每个词或字母产生对应的纹理。只要定位文本,使用我们新的方便的glPrint()命定就可以将文本显示在屏幕上。
我尽量让这条命令简单易懂。所以你需要做的就是键入glPrint(“Hello”)。就是那么简单。你可以用很长的介绍来说你因为这份教程而非常开心,然而写这个程序花费我大约1.5个小时。为什么这么长呢?因为并没有任何可以得到的关于使用Bitmap Font的文字信息,当然,除非你喜欢MFC代码。为了让这代码简单,我决定用简单易懂的C代码来写程序。J
小小的说明:这些代码是与windows相关的。它使用了Windows的wgl函数来产生字体。显然,Apple有agl来支持其平台,X有glx。不幸的是,我不能保证这些代码可以被移植的。如果任何人有平台无关的代码在屏幕上画字体,请将它发送给我,然后我将会写另一个教程。
我们将从Lesson 1中的典型的代码开始。我们将添加stdio.h用于输入/输出操作;stdarg.h头文件用来编译文本和将变量转化成文本,最后math.h文件让我们可以用SIN和COS来变化文本。
#include <windows.h> // Windows头文件
#include <math.h> // Windows数学库头文件(增加)
#include <stdio.h> // 标准输入/输出头文件(增加)
#include <stdarg.h> // 变量参数操作头文件(增加)
#include <gl/gl.h> // OpenGL32库头文件
#include <gl/glu.h> // GLu32库头文件
#include <gl/glaux.h> // GLaux库头文件
HDC hDC=NULL; // 私有GDI设备环境
HGLRC hRC=NULL; // 长期渲染环境
HWND hWnd=NULL; // 记录windows handle变量
HINSTANCE hInstance; // 记录instance handle变量
我们还将新增加3个变量。Base将会存储第一个显示列表的值.每个字母都需要其自己的显示列表。’A’字母的显示列表是65,’B’的是66,’C’的是67等等。所以’A’应该被存在第base+65个显示列表里。
接下来,我们增加两个counter: cnt1,cnt2。这些计数器将会以不同的比率来计数,以用来让文本通过SIN和COS在屏幕上移动。这将会产生在屏幕上产生一个伪随机运动。我们将会使用计数器来控制文体的颜色。(之后将会有更多关于这方面的内容)、
GLuint base; // 显示列表的第一个列表值
GLfloat cnt1; // 计数器1:用来移动文本和改变颜色
GLfloat cnt2; // 计数器2:用来移动文体和改变颜色
bool keys[256]; // 用于处理键盘消息的数组
bool active=TRUE; // 窗口活动标记,默认为TRUE
bool fullscreen=TRUE; // 全屏幕标记,默认为TRUE
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc函数声明
接下来的代码将产生真正的字体。这是最难写代码的部分。用简写的英文’HFONT’告诉Windows我们将要控制一个Windows字体。oldfont是用来保存之前的字体以便以后恢复。
下面我们将来定义基。我们首先通过glGenLists(96)