文档详情

计算机图形学课程设计--LOD地形渲染.doc

发布:2018-05-09约1.46万字共13页下载文档
文本预览下载声明
计算机图形学课程设计 ——LOD地形渲染 班级: 学号: 姓名: 指导老师: 课程设计目的 了解地形生成技术,掌握基于四叉树空间划分的LOD地形渲染,掌握天空的绘制方法,使用天空盒或者天空半球实现天空的绘制。 课程设计实现 地形渲染的研究 地形是计算机图形的一个重要的组成部分,地形具有覆盖面积大,数据要求精度高等特点。在绘制地形时我们往往使用多边形来模拟地形的表面细节,多边形通常又被划分为若干三角形,而地形数据通常是非常庞大的,因此需要绘制的多边形即三角形面片数量是非常庞大的。但是,在渲染地形的过程中由于地形非常庞大,所以对于离视点比较远的地形不需要用太多的三角形来模拟,而只需要在保证地形整体轮廓不变的情况用较少的三角形来模拟就可以了。因此,我们可以使用LOD技术来对地形进行简化。这里我们使用一种基于四叉树空间划分的算法来实现LOD地形。 设计数据结构 基于四叉树空间划分的地形渲染通常使用大小为2^n+1的高程数据作为数据源。所谓高程数据即彩色范围在0-255的灰度图片。图片上没一点的灰度颜色值代表了该点处地形顶点的高度值。由于灰度图片的颜色值被限制在0-255之间,所以我们可以设置一个常数因子heightScale来缩放灰度数据到一个合理的高度范围之内。我们还需要一个常量来设定地形顶点之间的水平距离。所以我们抽象出地形类的基本数据成员如下: Class Terrain { Private: BYTE* pHeightMapData; // 高程数据 Float heightScale; // 高度缩放值 Float cellWIdth; // 顶点水平距离 } 同时对于地形类来说我们要完成地形数据的初始化,地形的渲染这两个基本操作,因此还需要提供两个基本的公共接口来给外界使用。地形类结构如下: Class Terrain { Private: BYTE* pHeightMapData; // 高程数据 Float heightScale; // 高度缩放值 Float cellWIdth; // 顶点水平距离 Public: Void InitTerrain(); // 初始化地形数据 Void RenderTerrain(); // 渲染地形 } 有了地形类的数据结构,我们还需要一个四叉树来组织地形节点。首先介绍一下地形节点的概念,一个地形节点即一个四方形的地形,从地形的中心水平和垂直各画一条线,将这个四方形划分成四个等大的四方形,那么划分前的四方形就是一个地形节点,划分后的四个子四方形就是该地形节点的子节点,再对子节点经行划分直到不能继续划分就形成了一颗四叉树。对于四叉树节点的数据结构设计如下: struct TerrainNode { int centerRow; // 节点中心点的行索引 int centerCol; // 节点中心点的列索引 int halfRange; // 节点覆盖范围的一半 float deltaH; // 节点简化后的误差值 float radius; // 节点的包围球半径 float heightMin;// 节点的最小高度值(用于计算包围球或者包围盒) float heightMax;// 节点的最大高度值(用于计算包围球或者包围盒) tagTerrainNode* leftUpNode; // 节点的左上节点 tagTerrainNode* rightUpNode; // 节点的右上节点 tagTerrainNode* rightDownNode; // 节点的右下节点 tagTerrainNode* leftDownNode; // 节点的左下节点 } 地形数据的简化 在未进行简化的情况下,我们将一个地形节点使用8个三角形扇片来渲染,这时三角形面片的数量是非常巨大的,所以我们要对地形节点简化。所需渲染的三角形进行简化,我们可以考虑这个地形块每条边中间的顶点(下图左侧红色点): 如果这些红色顶点去除,我们就得到如上图右侧所示简化后的节点。注意误差就在这一步产生,由于红色点删除导致了原来边上由两条线段变为一条,而红点处顶点的高度值和简化后该边的中点值是不一定相等的,因此就会产生误差。 我们把红点处的高度值与该边中点的高度值的差值的绝对值,作为该边的简化之后的误差值,依次求出该节点四个边的误差值,并且选取最大的误差值作为该节点的误差值。如果该节点还有子节点,则选取其四个子节点和四个边中的最大误差值作为该节点误差。 在绘制过程中,我们根据节点的误差是否大于某个值,来判断节点是否可以被简化,若不可以被简化,则继续细分该节点。绘制过
显示全部
相似文档