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

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

  ·描述算法的流程

  预处理阶段:

  (1)载入地形数据,初始化顶点线性表。

  (2)初始化所有分辨率的block模型所对应的三角形带顶点索引表,此表保存的是组成三角形带的相对顶点索引。生成描述整个地形场景的block数组,每个block记录自身在场景中的绝对位置。

  (3)构造完全四叉树,每个子节点对应管理一片区域(一个或多个block),设置包围球半径。每个叶子节点都对应一个block索引。实时绘制阶段:

  (4)遍历完全四叉树,根据空间裁剪算法,得到可见block的索引。

  (5)计算这些block的网格分辨率,根据分辨率和网格的三角形带索引表,顶点表,可以得到组成地形网格的所有三角形带顶点的完整信息。

  (6)根据前面介绍的线性插值方法,调整相关顶点的高度信息。

  (7)送入渲染管道绘制。

  (8)回到(4)。

  ●测试结果

  我们使用大小为2049×2049的高程图作为实验数据,以Athlon2500+,DDR IG,ATI 9550,128M显存作为硬件环境对上述算法进行测试。程序用VC+OpenGL在windows平台上完成。其中分块大小为17×17,共分4个细节分辨率,以下是场景绘制的网格形式截图:

  从表3.1中的技术参数统计来看,新算法的渲染效率有很大提高,能满足大规模地型的渲染要求。

 

 

 3.6地形的空间管理和可见性剔除算法

  我们只对地形进行分辨率上的简化是不够的,摄像机在场景中只有一个可见范围,怎么样有效的剔除不需要渲染的地形部分,这就要涉及到地形的空间管理算法,可见性裁剪算法口9|。四叉树,八叉树,Bsp树,背面剔出等很多其他方法都是针对这个目的而提出的。本设计的可见性剔除采用了如下流程:

  3.6.1按距离剔除

  单靠视锥体剔除已经能剔除大部分面片,但是在他之前有一步距离剔除也是有必要的,因为他的计算很简单,就是通过计算地形block的包围球心与视锥体的距离,距离大于系数k的blocks统统剔除。k的确定一般与天空盒子的大小有关。

  3.6.2视锥体剔除

  从3D到2D投影过程中,需要一个投影体,只有当物体处于这个投影体中的时候,我们才能看到这个物体,否则物体将被裁剪掉。这个投影体通常被称为视见体(View Frustum)。在进行正交投影的时候,投影体为一个长方体,在进行透视投影的时候,投影体则为一个平头锥体,所以也叫视锥体。

  空间中物体与视锥体的关系有三种:在视锥体内,在视锥体外,与视锥体相交。只要我们排除在视锥体外的物体,也就是排除在视锥体外的三角形面片就能大幅提高渲染的效率。

  ·求视锥平面系数

  视锥体有上、下、左、右、近、远,共6个面组成。一个平面的方程可以表示为Ax+By+Cz+D=O。首先,把视锥体变换为长方体状的裁剪空间。如图3.16所示,左图为世界空间中的视锥体。右图为经过变换后的裁剪体。

  我们规定朝投影体内部的方向为平面的正方向,判断一个顶点是否在投影体内部时,只要把顶点坐标代入到六个面的方程中,通过检查结果的符号就可以判断点是不是在投影体内部(所有的符号都为正)。世界空间的投影体在经过投影变换后,会成为一个范体。我们很容易得到这个范体的六个面的方程。

  我们假设这六个面中某个平面上有一个点(x0,y0,z0,1),在进行投影变换之前的坐标为(x0",y0",z0",1)。这个平面的方程为Ax+By+Cz+D=0。投影变换前,在世界空间中的方程为A"x+B"y+C"z+D=0,则点必须满足:

  如果变换矩阵为T,则投影前后的点要满足(xO’,yO’,zO’,1)XT=(xO,yO,zO,1)。通过这三个等式,我们可以得到

  再根据投影空间中范体的六个面的方程,我们现在可以很容易的得到世界空间中的投影体的六个面的方程。我们已经有了裁剪体的方程,当我们需要判定一个顶点是否在视锥体中的时候,这六个方程已经足够了。在OpenGL中得到裁剪体六个面的方程系数的伪代码如下:


 

文章评论