室外大场景渲染技术研究与实现 游戏地图加载(5)

时间:2012-11-08   来源:   网友评论:0   人气: 1280 作者:

  3.5.2 GeoM i pMap优化算法

  ·地形数据的总体组织和表示

  我们首先读入一个场景的高度图数据(heightmap),保存在一个顶点线性表中,然后把这个场景在XZ平面上划分成均匀大小的多个block。block的大小按需求而定,其边长满足2l+l,如9×9,17×17,33×33等。如果地势总体比较平坦,我们可以选得大一点,如果对地形的细节要求较高我们可以选得小一点。本文以17×17作为block的大小。block通过顶点索引所组成的三角形带描述他负责的一片小的区域。整个场景用一棵完全四叉树把这些blocks组织起来。实时渲染时完全四叉树负责场景的裁剪,决定哪些blocks应该绘制,然后计算可见block的网格分辨率,从而得到整个地形要渲染的三角形面片。其数据组织图如下所示:

  用面向对象的方式描述地形对象:

  当地形是超大地形绘制时,我们采用多线程机制加上场景缓冲池的方法实现大地形数据的动态调入和管理。每一个场景Tile作为动态加载单元,用一个缓冲池来管理,用单独线程来维护。详细讨论在3.7节。

  · block多分辨率网格模型的构造和数据组织

  Willem在他的论文中指出当细节层次不同时block的顶点取舍方法,以及为了避免出现T型裂缝,block的边界顶点应该怎么调整。在他的思想基础上,本设计提出一种基于查找表的block三角形带生成方法。

  我们把block的中心地带和边界分开对待。在预处理阶段就生成五个顶点索引表。如图3.12所示:

  中心地带索引表负责生成block中心的三角形条带,其索引参数就是自身的网格分辨率。边界索引表负责生成与其他block相邻区域的三角形带(防止T型裂缝)。索引参数有三个:自身的网格分辨率,相邻的方向,相邻block的网格分辨率。

  网格都使用三角形带(Triangle Strip)的方式生成,有些地方需要生成一些退化三角形,用于三角形带的连接。运用三角形带的方式比三角形扇和纯粹三角形方式更能减少顶点个数,提高绘制效率。

  这五个位置的网格所关联的索引表一起就能够描述任何一个block网格所有顶点的相对位置(在block区域内的位置)。在场景渲染初始化时,我们读入block的五个LOD顶点索引表,得到block的不同分辨率网格。在实时渲染的时候,针对一个特定的block,我们可以根据这个block在场景中的起始位置,他的网格分辨率,和他四周block的网格分辨率,直接查表得到这个block完整的三角形带顶点索引,减少了CPU的判断和计算量。内存中只保存一个block网格顶点的相对索引,不是整个场景的所有block的顶点索引都保存,因此不会造成什么内存消耗。

  · 用面向对象的方式来描述block

  block是本算法很重要的对象,可以描述如下:

  · 利用线性插值逐步过渡不同分辨率的网格模型

  当block的网格分辨率次发生变化时,其网格模型可能变化较大,由于变化是在瞬间完成的,极易被观察者察觉。但如果我们把这种变化由突变改为渐变,用户就不易察觉,其视觉影响也就可以忽略不计。

  我们在预处理阶段已经得到一个合适的查找表,可以查出block的网格分辨率c与block到视点的距离d之间的对应关系。我们假设d=lOOOm时c=n+l,d=2000m时c=n。

  如果现在d=1500m,则网格的分辨率正处在n和n+l的过渡阶段。我们取网格顶点为c=n+l时的索引,他比c=rl时多出一些细节顶点,对这些多出的细节顶点,我们对其高度进行线性插值,使其缓慢在分辨率n+l和分辨率rl之间过渡。如图3.13,v3为高分辨率时出现的细节顶点,v4为模型在低分辨率时v3的初始点。随着网格向高分辨率过渡,v4逐步过渡到v3。v’的Y坐标由下面的公式决定:

  如3.13图:

  采用这种插值的手段后,只增加了很少的计算,视觉效果上却得到了很大的提高。

  ·利用显存保存地形的顶点表

  现代图形卡已经支持把一定大小经常使用的数据直接保存在显存中,所以如果我们把经常使用不频繁变动的数据保存在显存中,可以避免大量数据在渲染时频繁从内存传输到显存。在实验中通过0penGL的VBO(Vertex Buffer Object)方式把顶点线性表数据保存在显卡中,经比较渲染速度大幅提高。


 

文章评论