关于OPENGL中字体显示

来源:互联网 发布:app软件销售 编辑:程序博客网 时间:2024/04/29 17:42

最近在做OpenGL显示方面的工作,很简单的一些处理,只涉及到二维的处理。其中有关于文字显示方面的工作,在此与大家分享我的体会,希望大家互相交流一下。

 

文字显示首先是解决字库的问题。字库(或者称字体)分点阵和矢量两类,其中矢量字体实现很复杂,具体原因大家可以在网上搜索一下相关文章学习。我在做文字显示时采用的是点阵方式的字库。字库采用点阵字库生成工具生成,这个有人在网上提供。我使用的工具生成字库时可以选择字体大小,字体(黑体,宋体,等PC机上安装的字体都支持),做得相当不错。

字库生成后以文件的形式存在PC机硬盘上,具体文件格式得看具体工具怎么设计。我用的工具以二进制方式存储,对ASCII码,每个编码占用(fontHeight*((fongWidth/2 +7)/8))个字节,因为对于ASCII码通常采用汉字一半的宽度进行显示,例如24×24的字体,其fontHeight=fontWidth=24,一半宽度为12个点,即点阵每行显示12个像素,这样需占用(12+7)/8=2个字节存储一行的点阵,整个ASCII码需要24×2=48个字节进行存储。对于汉字每个占用(fontHeight*((fongWidth+7)/8))个字节,即为ASCII码的2倍空间。上述公式均为C语言表达方式。

字库生成后可能需要按自己的需求进行转换。例如平台如果不支持文件系统的话,可以把字库转成C语言方式,对每个字符的点阵以unsigned char数组方式存储,并设计一种方式进行索引。这样可以把生成的文件加到工程中进行编译链接,通过引用对应的数组获取字符的点阵信息。这部分工作就需要对工具生成的字库存储的格式相当清楚,工具一般按标准做成,如国标GB2312,BIG5等,所以要求掌握标准的基本内容。之后要明确自己需要的字符集,对工具生成的字库进行裁剪,如只取一级汉字库,只取字目数字,看个人需求而定。这需要自己设计做程序实现。

 

接下来说一下点阵字体显示的方式。我现在知道有三种方式:

1.利用glVertex打点,方法简单,就是按点阵逐行打点;

2.利用glBitmap,这种方式最常用,但是OpenGL对位图的解释是从左下角开始解析的,而后向上逐行按从左至右的方式解析,所以如果直接按方法1中用到的点阵数据进行位图显示,看到的效果是一个颠倒的文字;由于Windows上OpenGL实现中的bug,其使用位图必须32位对齐,如果要在Windows平台上试验位图方式显示文字,可以选择32,64,128位宽度的点阵字体,或者对非32位对齐的字体,对字符的每行进行补零,使其32对齐,如果有更好的方法请告知。

3.利用纹理贴图的方式。原理是对每个文字生成一个纹理,显示文字的时候,首先画一个矩形,并把要显示的文字的纹理贴到矩形上即可。这种方式可以实现文字的缩放,我们只需要一种大小的点阵字库,通过控制矩形大小可以实现文字的任意缩放,当然效果得看选取的点阵及缩放的比例。

如果大家有更好的方法,希望共同交流。

整理实现代码后继续。.........

 

 

原创粉丝点击