一种基于OSG的大批量文字渲染方法与流程

文档序号:16634052发布日期:2019-01-16 06:50阅读:1079来源:国知局
一种基于OSG的大批量文字渲染方法与流程

本发明属于地理信息系统技术领域,特别涉及一种基于osg的大批量文字渲染方法。



背景技术:

在地理信息系统(简称gis)行业中,海量数据一直是地理数据的一个显著特征,无论是栅格矢量数据还是模型业务数据,都能轻松达到tb级,为了直观和便捷的查看这些庞大的数据,三维可视化技术发展迅速,而openscenegraph(简称osg)作为一款开源高效的三维引擎也受到了越来越广泛的应用。在三维场景中为了对所展示数据进行注释和说明,文字的使用已经成倍增加。例如我们经常加载的全国甚至全球的各级地名数据,从国家首都到各省省会,从各级地市再到村庄乡镇,文字的用量巨大,这给图形渲染带来了巨大的压力。以陕西省为例,其下大约有1768个乡镇,如果每个乡镇名都实时渲染的话,系统的渲染帧率会急速下降,导致卡顿甚至卡死。通常的硬件环境,按照常规的文字渲染方式,能够承受的文字渲染量大概在1000左右(具体由机器性能而定),而实际的需求远大于此。

为了解决常规文字渲染效率低下与其巨大需求间的矛盾,通常的解决方案是利用levelsofdetail(简称lod)的思想,即在不同的级别显示不同的地名,例如在太空中俯瞰地球时,我们可以只显示各国首都的地名,在视点的距离拉近时,首都的地名消失,省会的地名出现,最终显示乡镇的地名,同时结合视域裁剪技术,将视域以外的地名进行裁剪,从而在控制同屏文字数量上限的同时,又能通过视点的移动查看到所有的地名信息。这种方案虽然能在一定程度上解决问题,但在本质上,它只是一种调度方案,它并没有从根本上提升文字的渲染效率,并且这种调度,在某些情况可以使用,但在另外一些场景可能就不能满足需求,比如在某些目标监测系统中,文字负责显示每一个目标的当前状态,是必须始终显示的,这种情况下,lod的方案就无法适用,因此我们需要新的方案来解决问题。



技术实现要素:

本发明的目的在于提供一种基于osg的大批量文字渲染方法,以解决上述问题。

为实现上述目的,本发明采用以下技术方案:

一种基于osg的大批量文字渲染方法,包括以下步骤:

步骤1,将系统中所有文字的字符纹理合并到一张或者多张合并纹理上;

步骤2,修改文字顶点的纹理坐标,使其指向新生成的大纹理中对应的位置;

步骤3,合并文字顶点,将所有的文字顶点合并到一块顶点内存中,并修改其索引值;

步骤4、绑定步骤1-3中创建的顶点,索引,纹理坐标内存,绑定合并后的纹理,进行渲染。

进一步的,步骤1具体为:创建一张合并纹理,然后遍历每一个文本对象,取出其中的字符纹理,然后将字符纹理的像素值写入到合并纹理中,如果一张合并纹理不足以存储全部字符纹理,那么再创建一张新的合并纹理,并重复步骤1。

进一步的,合并纹理的大小为512*512像素、1024*1024像素或2048*2048像素。

进一步的,步骤2具体为:创建一块纹理坐标内存,然后遍历每一个文本对象,修改其纹理坐标,使其指向在步骤1中合成的合并纹理中对应的位置,然后将新的纹理坐标写入到纹理坐标内存中。

进一步的,步骤3具体包括:

1)创建一块顶点内存,然后遍历每一个文本对象,将单个文本对象的顶点数据写入到顶点内存中;

2)创建一块索引内存,然后遍历每一个文本对象,将单个文本对象的索引值写入到索引内存中,同时修改索值,将当前索引值加上已写入的顶点总数。

与现有技术相比,本发明有以下技术效果:

本发明将现有的多批次渲染对象通过字符纹理、修改文字顶点的纹理坐标,以及合并文字顶点进行合并渲染,利用显卡在设计时对于一次渲染大量数据的效率要远高于这些数据的分开多次渲染的机制,可以将几千批的渲染次数骤降为几批,从而在保证同样显示效果的基础上提升了渲染效率。

附图说明

图1是本发明方法的流程图;

具体实施方式

以下结合附图对本发明进一步说明:

请参阅图1,一种基于osg的大批量文字渲染方法,包括以下步骤:

步骤1,将系统中所有文字的字符纹理合并到一张或者多张合并纹理上;

步骤2,修改文字顶点的纹理坐标,使其指向新生成的大纹理中对应的位置;

步骤3,合并文字顶点,将所有的文字顶点合并到一块顶点内存中,并修改其索引值;

步骤4、绑定步骤1-3中创建的顶点,索引,纹理坐标内存,绑定合并后的纹理,进行渲染。

步骤1具体为:创建一张合并纹理,然后遍历每一个文本对象,取出其中的字符纹理,然后将字符纹理的像素值写入到合并纹理中,如果一张合并纹理不足以存储全部字符纹理,那么再创建一张新的合并纹理,并重复步骤1。

合并纹理的大小为512*512像素、1024*1024像素或2048*2048像素。

步骤2具体为:创建一块纹理坐标内存,然后遍历每一个文本对象,修改其纹理坐标,使其指向在步骤1中合成的合并纹理中对应的位置,然后将新的纹理坐标写入到纹理坐标内存中。

步骤3具体包括:

1)创建一块顶点内存,然后遍历每一个文本对象,将单个文本对象的顶点数据写入到顶点内存中;

2)创建一块索引内存,然后遍历每一个文本对象,将单个文本对象的索引值写入到索引内存中,同时修改索值,将当前索引值加上已写入的顶点总数。

以10个字符为例,实施例1:

创建一张合并纹理,比如1024*1024,然后遍历每一个文本对象,取出其中的字符纹理,然后将字符纹理的像素值写入到大纹理中,如果一张大纹理不足以存储全部字符纹理,那么再创建一张新的大纹理,并重复步骤3;

创建一块纹理坐标内存,10个字符对应320字节的纹理坐标内存,然后遍历每一个文本对象,修改其纹理坐标,使其指向在步骤1中合成的合并纹理中对应的位置,然后将新的纹理坐标写入到纹理坐标内存中。

创建一块顶点内存,10个字符对应顶点内存为480字节,然后遍历每一个文本对象,将单个文本对象的顶点数据写入到顶点内存中;

创建一块索引内存,10个字符对应索引内存为240字节,然后遍历每一个文本对象,将单个文本对象的索引值写入到索引内存中,同时修改索值,通常需要将当前索引值加上已写入的顶点总数。

使用freeearth平台进行如下实验:任何三维平台都可以实现,本例只是用freeearth平台进行测试在同一台机器上,先后用常规模式和优化后的方案渲染2000批文字,

其渲染耗时如下:

freeearth是基于openscenegraph、osgearth开发的多行业可自由扩展的二次开发gis平台,该平台中对osg的文字对象进行了优化改造,使得在大批量文字的应用场景中,其渲染效率得到了显著提升。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1