opengl es2.0 使用字符偏移图渲染文字

本文介绍了在OpenGL ES2.0中利用FreeType库和纹理偏移图技术来渲染文字的方法。通过生成字符偏移图、解析绘制文本和渲染文本三个步骤,减少了纹理切换频率,提升了渲染效率。文中详细阐述了每一步的实现过程和优缺点,并提供了简单的代码示例和最终效果展示。
摘要由CSDN通过智能技术生成

在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字

这里我使用的freetype这个三方库·

FreeType 2.0

     FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件,

包括点阵字、TrueType、OpenType、Type1等

(1)它使得客户应用程序可以方便地访问字体文件,无论字体文件存储在哪里,并且与字体格式无关。
(2)能方便地提取全局字体数据,这些数据普遍存在于一般的字体格式中。(例如:全局度量标准,字符编码/字符映射表,等等)
(3)能方便地提取某个字符的字形数据(度量标准,图像,名字等其他任何数据)
(4)具备访问字体格式特定的功能(例如:SFNT表,多重控制,OpenType轮廓表)

关于freetype的使用方法,网上有很多技术文档这里就不再详述,有兴趣的朋友可以参考以下几个链接

http://blog.csdn.net/vrix/article/details/2873436

http://www.unixresources.net/linux/clf/kylix/archive/00/00/59/21/592188.html

http://blog.csdn.net/finewind/article/details/38009731

纹理偏移图(Texture Atlas)

     将许多小的纹理合并拼接到一张大图当中计算好对应的纹理坐标,然后在需要用到的时候,加载这张大图然后使用对应的纹理坐标显示出想要的效果。

这样做的好处就是,就是合并纹理后,在渲染的时候可以减少opengl切换纹理的频率, opengl在绑定纹理也就是调用glBindTexture 效率是比较低的。

文字渲染的方式

     在opengl中显示文字,有如下几种方式:

          a)一个字生成一张位图,然后贴图

          b)一串字生成一张位图,然后贴图

          c)先将需要用到的字生成到一张位图中,然后需要渲染的时候根据每个字所在位图的纹理坐标然后贴图显示

     下面我们来分析一下各种方式的优缺点:

          a这种方式是灵活性最高的一种,可以任意指定单个字的大小啊颜色啊描边什么的,但是如果视口中需要显示的文字比较多,这种方式所带来opengl纹理切换

      频率会极大的拖慢opengl的渲染效率

          b这种方式可以任意指定一串字的样式,但是对于单个字样式的指定就比较欠缺,并且相对于a在渲染效率上面会有很大的提升

          c这种方式的文字渲染效率相比于a、b,能够极大的提升字体渲染效率,但是内存占用上会比较多,也多了很多限制(之后详述)

     上述的三种方式都有自己的优缺点,至于具体应该选用哪种方式,还是得根据需求来选取最优的方式

  下面开始就要介绍主要内容了,使用文字偏移图方式渲染文字,主要分三部分进行:生成文字偏移图、解析绘制文本、渲染文本

 生成文字偏移图

     要生成文字偏移图就要用到freetype库和我上面介绍的纹理偏移图技术,基本流程可以概括为:从freetype中根据字体取出所有字符的字模,然后逐个拼接到

 一张大的纹理当中,然后生成一个字符映射表(主要是字符到纹理坐标)

     整个流程看起来好像很简单,其实并不然,对于unicode来说,宽字节范围0~65535,然后opengl对于一张位图的大小也是有限制的,可以通过如下方式获取到

GLint max;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);

, 假设最大的尺寸是1024x1024的一个字符按照16x16的大小来算一张位图最多也只能放置

4096个字符,如果想要缓存全部字符,至少也是10+张偏移图了,这样显然是不合理的,毕竟我们平时并不是所有的字符都会用到,大部分的字符我们是用不到的,我们

只需要能存进我们用到字符到偏移图里就可以了,但是很遗憾,字符编码里并没有划定固定的哪段是常用的而哪些是不常用的,这里我的处理方式是从网上收集到其他

人整理到的3500个字符先到纹理偏移图中,然后如果之后有新的字符产生,就再加进去(会影响到一定的效率)。

   其实对于常用的应用程序来说4096个字符基本足够使用了,但是如果需要缓存的字符超过了4096了呢?  显然一张字符图肯定是不够使用的,在这里我在生产偏移图

的地方加入了当超过了一张图的字符缓存范围后,再创建一张字符偏移图,然后再字符映射表里添加了关于字符偏移图的索引(既一个字符具体在那张偏移图里)

简要代码参考如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值