一.三维场景中文字的使用类型
1使用OpenGL位图
使用方法:
使用函数
glRasterPos*()指定屏幕位置,使用glBitmap绘制位图。
使用位图的缺点
如果放大缩小显示,不作处理的话,效果难看。
点阵字库字体种类少
点阵字库通常是由版权的,如汉字库方正。
2 使用微软提供的位图字体和轮廓字体
(1)位图字体
使用Windows函数wglUseFontBitmaps()提供从系统中读取相应的字符文件来创建位图
wgl位图字体的特点:
二维文字,字形信息存储成位图图像的形式。
放大会有锯齿,没有反走样效果。
渲染时一般使用正交投影。(wglUseFontBitmaps以及后面wglUseFontOutlines在WINGDI.h中定义)
(2)轮廓字体
使用Windows函数wglUseFontOutlines (),用法和位图字体很相似,在轮廓字体定义的字体中,字符是一系列直线和弧线。
轮廓字体的特点:
文本有了厚度(depth )参数,轮廓字体可以是三维的,使文字像三维物体一样。可以被放大缩小质量不损失。
wgl绘制文字的缺点:
使用wgl函数只能在Windows平台下用,不具有跨平台特性。
效果一般,放大缩小时还是会有锯齿。
灵活性不高,不好给文字加边框显示,文字在南极处看不清楚。
文字重叠时效果比较差,不好做文字避让等其他复杂的效果。
3 使用纹理字体
1)使用方法
基本原理是使用有一个纹理来显示任意n*n个不同的字符。记住平均一个字符只有n个像素宽,大概n个像素高。
然后绘制四边形,给他贴上字体纹理中的单个字符的纹理来完成的。(参考资料NeHe教程第24课)
使用纹理字体的优点:
使用管理纹理的方式管理文字,更加方便。
使用显示列表管理很小的文字纹理提高效率。
可以给纹理添加mipmap效果,从而改善文字放大缩小时的显示走样的问题。
可以将文字二维三维都渲染,可以增加文字避让的功能。
使用纹理字体的缺点:
缺点是只适合英文,不适合中文,因为中文太多了,虽然很多文字我们几乎是用不到,如果每一个字体对应一张纹理很不划算。
中文需要2048*2048大小的纹理,而且只是一种字体
4 使用TTF字体
1)TTF字体介绍
TTF是True Type Font的简称。在Windows/Fonts目录下面后缀为TTF的文件。
TTF是一种矢量字库。因此显示画面时不会出现锯齿或马赛克。
使用FreeType库可以创建非常好看的反走样的字体,做魔兽世界的暴雪公司,以及Quake这样的经典游戏,都是用的TTF字库。(FreeType的免费库http://www.freetype.org)
2)使用TTF字体基本流程
首先连接字库文件。
根据文字编码和所需字体大小取出字槽。
将字槽生成纹理,使用mipmap方式。
将文字纹理贴在指定的位置显示。(参考资料NeHe教程第43课)
3) 使用TTF的优点
反走样的显示效果好。
拥有纹理字体的所有优点。
可选择的字库多,甚至可以定义自己版权字库。
跨平台,windows,linux等平台都支持。
OpenGL和D3D图形接口都支持。
二.TTF文字的使用方法
1 文字投影方式两种
二维文字和三维文字,即正交投影和透视投影。
2 文字透视效果,远小近大的效果。
目标点经纬度位置为原始大小,靠近处放大,远离处缩小,缩放比例在一定范围之间。
3 文字的边框算法。
使用绘制8次的方法。
4 文字的反走样处理。
使用TTF自带的反走样功能和OpenGL的mipmap
5 文字的Billboard。
使用面向屏幕的公告板。
6 文字避让。
可以利用脏区记录计算4个方向的避让。
三.相关知识点
1 字符Unicode编码
Unicode是一种字符编码方法,是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
例如“汉”字的Unicode编码是6C49。
2 Billboard技术
最初是发布消息用的,主要是使用在贴纹理的多边形。
对齐屏幕的公告板(Point-Rotated-Billboard),适合对称球状物体。
面向视点的公告板(Viewpoint-Oriented-Billboard),始终朝向视点。
轴向公告板(Axial-Billboard),适合圆柱对称物体。
下面是使用效果: