欢迎来到天天文库
浏览记录
ID:50444964
大小:757.50 KB
页数:23页
时间:2020-03-09
《清华大学DirectX游戏编程第14章(全20章).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第14章基本地形渲染本章将讲述如何实现一个简单的地形类。主要目标:学习如何生成渲染地形需要的高度信息,高度信息将用于在程序中模拟山峰、峡谷等自然地形。理解怎样生成代表地形的顶点和三角形数据。学习地形纹理设置和为地形打光的方法。学习如何在地形渲染中控制摄像机位置,模拟人在场景中行走和奔跑的效果。214.1高度图高度图用来描述地形的高度信息。高度图实际上是一个数组,数组中的每个元素都存储着地形网格中对应顶点的高度数据将高度图数据读入内存时,通常为图中的每个元素分配一个字节的内存,这样高度的范围就是0~255。图14.2展示了用作高度图的灰度图。314.1.1
2、高度图的创建高度图可以通过程序生成,或者通过AdobePhotoshop这样的图像处理软件来制作。图14.3展示了用AdobePhotoshop创建的金字塔地形。414.1.2读取RAW文件由于RAW文件中的数据仅仅是连续的字节块的集合,可以用下面的方法方便地得到其中的数据。这里变量_heightmap是Terrain类的成员,其声明如下:参见教材P209注意这里把存储BYTE数据的vector里的数据拷贝到存储int数据的vector里,这样就可以扩大高度数据,使其超出0~255的限制。514.1.3高度图的访问和修改Terrain类提供下面两个方法来
3、访问和修改高度图中的元素:intTerrain::getHeightmapEntry(introw,intcol){return_heightmap[row*_numVertsPerRow+col];}voidTerrain::setHeightmapEntry(introw,intcol,intvalue){_heightmap[row*_numVertsPerRow+col]=value;}614.2生成地形几何数据图14.4展示了地形的一些属性、术语和需要使用到的特殊顶点。Terrain类的定义如下:参见教材P211通过构造函数传入的值,可以计算出
4、地形需要的其他变量:参见教材P212顶点结构声明如下:参见教材P212714.2.1计算顶点下面需要计算的是纹理坐标,参照图14.5,通过它可以看出(u,v)纹理坐标和地形的顶点(i,j)的对应关系:生成顶点的代码如下:参见教材P213814.2.2计算索引——定义三角形为计算三角网格中的顶点索引,只需从左上角到右下角遍历每个方格,然后计算组成这个方格的两个三角形的顶点索引值,参照图14.6。914.2.2计算索引——定义三角形通过图14.6发现在第i行第j列的方格具有以下性质:参见教材P215生成索引值的代码:参见教材P2151014.3纹理Terra
5、in类提供了两种方法来为地形加上纹理,较简单的方法是载入并使用一个先前做好的纹理图。Terrain类中实现了下面的方法,把图片文件中的纹理数据载入到IDirect3DTexture9对象中,并使用_tex指针指向它。Terrain::draw方法在渲染地形之前将会设置_tex的值。这里给出该函数的具体实现,其过程非常简单:参见教材P2161114.3.1用程序生成纹理数据另一种给地形贴上纹理的方法是用程序计算纹理数据,也就是说先创建一个“空”的纹理,然后在代码中按照一些预定义的参数来计算每一个纹素的颜色值。通过用Terrain::genTexture方法
6、创建纹理:首先调用D3DXCreateTexture创建一个空的纹理,然后锁定最高级别的数据区,遍历每个纹素并设置它的颜色值。Terrain::genTexture方法也同时会计算mipmap纹理。用D3DXFilterTexture函数可以完成这个任务,genTexture方法的实现代码如下:参见教材P2161214.4光照Terrain::genTexture方法里会调用Terrain::lightTerrain方法,这个方法为地形增加了光照效果,从而使渲染的真实感更强。为什么要照亮所渲染的地形呢,而且为什么不让Direct3D来处理光照呢?我们自己
7、来进行这种计算会有如下的三个好处:不用保存顶点法线的信息,节省内存。由于地形一般是静态的,光源的位置也不会改变,因此预先计算好光照,就可以省下Direct3D实时为地形计算光照的时间。顺便做一些数学练习,熟悉基本的光照理论,练习使用Direct3D的函数。1314.4.1概述这项用来计算地形阴影的光照技术是最基础的技术之一,被称为散射光照技术。设置一个平行光源,并指定它的方向与从光源发出的光线的方向相反。从图14.7可以看到这个角度越大,方格就越背离光源,得到的光照就越少。通过光照向量和表面法线向量之间的角度关系,可以构建一个阴影因子,它的取值范围为[0
8、,1],并决定表面获得的光照量。1414.4.2计算方格的阴影首先需要在方格表面
此文档下载收益归作者所有