Frestone的博客

字体简介:

点阵字库

包括现在,有很多游戏都还是使用的点阵字库。因为操作起来比较方便,加上这方面的经验已经积累了好几年了。通常如果只是一种字体就可以满足需要的话,它会是一个比较好、快的解决办法。但是它有3个缺点:

1. 如果放大显示,不做处理的话,显示出来的汉字,是很难看的。

2. 像是UCDOS所提供的点阵字库,只有24点阵的有几种字体,如:宋体、黑体、揩体…,而16点阵的好象就只有宋体一种。

3. 点阵字库,通常是有版权的,尤其是第三方制作的汉字库(如:方正)。

在这样的情况下,当我们写好这样的一个显示函数,就算是解决了如:放大、快速显示等问题的话,可供选择的字体还是太过于局限了。所以,在字体的要求比较强的情况下,点阵字库并不是一个好的解决方法,他不够灵活。尽管我们对于它的操作是如此得熟练,可以写出优美的代码来展示我们的编程技巧。

TTF

TTF是True Type Font的简称。在Windows/Fonts目录下面,,我们可以看到许多后缀为ttf的文件,它就是接下来我们接下来所要谈到的。

TTF是一种矢量字库。我们经常可以听到矢量这个词,像是FLASH中的矢量图形,在100*100分辨率下制作的flash,就算它放大为全屏,显示出的画面也不会出现马赛克。所谓矢量,其实说白了就是用点和线来描述图形,这样,在图形需要放大的时候,只要把所有这个图形的点和线放大相应的倍数就可以了。而且,在网站上有很多的TTF字库可以下载,或者你可以去买一些专门的字库光盘。然后在你发行你精心制作的游戏时,可以顺便捎上这些后缀为.ttf的文件就行了。包括Quake这样的惊世之作,也都是用的TTF字库。

这样,我们就可以解决点阵汉字的一些问题。通过TTF,我们在字体的质量和字库的数量上获得了暂时性的胜利。

双字节字体:

汉字是由2个字节保存,而英文只需要1个。而判断一个字是否是汉字,只需判断第1个byte是否>128(在原来的GB2312中,汉字的2个字节都是>128的。而新的GBK字库,汉字的第2个字节不一定>128,我想这是扩大了字库容量的原因。我的意思是说,如果给一个字符串你,随机给其中一个位置,然后我问你这个位置是什么?你的回答只能是:1 英文 2 汉字的首字节 3 汉字的尾字节。而这个问题的解法,为了稳妥起见,你必须从字符串的开始判断起)。也就是说在char[3]中,如果保存的是汉字,则char[0]保存汉字第1个字节,char[1]保存汉字第2个字节,第3个存放’/0’;如果是英文的话,则只用到char[0],其它的全部为’/0’。

struct Char{

WORD hz;// 文字

Char() : hz(0) {}

// 用作查找文字

inline bool operator == ( WORD h ) const

{

return hz==h ?true:false;

}

};

用VECTOR存储常用文字索引,绘制文字时先查找VECTOR,没有就新建,然后放入VECTOR。

OpenGL显示字体:

1. 位图Bitmap Fonts :适合单独缩放和旋转的标签,速度比较块,位置由glRasterPos决定,因此(-1,1)范围内的文字将会被显示,只要文字对象的位置超出屏幕范围之外,即便是有部分文字可以显示,仍然不会被绘制。

2. 轮廓线Outline Fonts:将字符转化为控制点和曲线,可以是线也可以是多边形,有opengl 3D几何体的所有特性:包括移动,旋转,缩放,材质贴图,灯光,反走样。

3. 贴图映射Texture Mapped Text:将文字制作成贴图的模式,对贴花字体很有效(如电线杆上的广告,街道指示牌等),拥有opengl贴图的特性。

不同平台的具体实现:

Glx:X系统

glXUseXFont(),创建一个显示列表集,然后调用显示列表。

优点:X系统下能很好的显示任何字体

缺点:只能是位图文字

GLC:只适用于Adobe公司的Type1字体,只能在SGI工作站上使用,提供位图,线条,三角面显示模式。(直接略过)

GLUT:

提供了两种方法:位图-glutBitmapCharacter() 笔画-glutStrokeCharacter()

优点:简单

缺点:字体太少,必须使用GLUT库

贴图映射:将字符绘制成贴图

优点:高效(在支持硬件贴图的机器上很快),GLX上很容易使用

缺点:有限字符集很有效,字符太多的语言则不适用(需要好的管理策略),字体缩放或低采样时会降低质量,字体间距容易出错。

GLTT:对FreeType库的进一步封装。支持位图,抗锯齿,轮廓线,多边形模式。可以直接修改字体,实现特殊效果。

优点:简单,灵活,跨平台,可使用TrueType字体。

缺点:速度比贴图映射要慢。

FTGL:

也是采用FreeType库。采用标准的字体文件格式,可以直接读取字体文件。支持位图,抗锯齿,贴图映射,轮廓线,多边形格网,突出(挤压)多边形格网。

优点:简单,灵活,跨平台,能使用任何TrueType字体。

缺点:字体载入时间长。

WGL:位图-wglUseFonBitmaps() 轮廓线-wglUseFontOutlines(), 微软平台

优点:简单,可以使用任何微软平台的字体

缺点:WINDOWS ONLY,不提供字体修改,速度慢。

GLF:罗马人创建的字体渲染库,支持大量的渲染模式:线框,位图,贴图映射,挤压线框和实心。

优点:简单,多平台

缺点:.glf格式字体文件没有文档化。

年轻是我们唯一拥有权利去编织梦想的时光

Frestone的博客

相关文章:

你感兴趣的文章:

标签云: