- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第14章DirectX编程
第14章 基本地形渲染 本章将讲述如何实现一个简单的地形类。 主要目标: 学习如何生成渲染地形需要的高度信息,高度信息将用于在程序中模拟山峰、峡谷等自然地形。 理解怎样生成代表地形的顶点和三角形数据。 学习地形纹理设置和为地形打光的方法。 学习如何在地形渲染中控制摄像机位置,模拟人在场景中行走和奔跑的效果。 14.1 高 度 图 高度图用来描述地形的高度信息。高度图实际上是一个数组,数组中的每个元素都存储着地形网格中对应顶点的高度数据 将高度图数据读入内存时,通常为图中的每个元素分配一个字节的内存,这样高度的范围就是0~255。 图14.2展示了用作高度图的灰度图。 14.1.1 高度图的创建 高度图可以通过程序生成,或者通过Adobe Photoshop这样的图像处理软件来制作。 图14.3展示了用Adobe Photoshop创建的金字塔地形。 14.1.2 读取RAW文件 由于RAW文件中的数据仅仅是连续的字节块的集合,可以用下面的方法方便地得到其中的数据。这里变量_heightmap是Terrain类的成员,其声明如下: 参见教材P209 注意这里把存储BYTE数据的vector里的数据拷贝到存储int数据的vector里,这样就可以扩大高度数据,使其超出0~255的限制。 14.1.3 高度图的访问和修改 Terrain类提供下面两个方法来访问和修改高度图中的元素: int Terrain::getHeightmapEntry(int row, int col) { return _heightmap[row * _numVertsPerRow + col]; } void Terrain::setHeightmapEntry(int row, int col, int value) { _heightmap[row * _numVertsPerRow + col] = value; } 14.2 生成地形几何数据 图14.4展示了地形的一些属性、术语和需要使用到的特殊顶点。 Terrain类的定义如下: 参见教材P211 通过构造函数传入的值,可以计算出地形需要的其他变量: 参见教材P212 顶点结构声明如下: 参见教材P212 14.2.1 计算顶点 下面需要计算的是纹理坐标,参照图14.5,通过它可以看出(u, v)纹理坐标和地形的顶点(i, j)的对应关系: 生成顶点的代码如下: 参见教材P213 14.2.2 计算索引——定义三角形 为计算三角网格中的顶点索引,只需从左上角到右下角遍历每个方格,然后计算组成这个方格的两个三角形的顶点索引值,参照图14.6。 14.2.2 计算索引——定义三角形 通过图14.6发现在第i行第j列的方格具有以下性质: 参见教材P215 生成索引值的代码: 参见教材P215 14.3 纹 理 Terrain类提供了两种方法来为地形加上纹理,较简单的方法是载入并使用一个先前做好的纹理图。 Terrain类中实现了下面的方法,把图片文件中的纹理数据载入到IDirect3DTexture9对象中,并使用_tex指针指向它。Terrain::draw方法在渲染地形之前将会设置_tex的值。 这里给出该函数的具体实现,其过程非常简单: 参见教材P216 14.3.1 用程序生成纹理数据 另一种给地形贴上纹理的方法是用程序计算纹理数据,也就是说先创建一个“空”的纹理,然后在代码中按照一些预定义的参数来计算每一个纹素的颜色值。 通过用Terrain::genTexture方法创建纹理:首先调用D3DXCreateTexture创建一个空的纹理,然后锁定最高级别的数据区,遍历每个纹素并设置它的颜色值。 Terrain::genTexture方法也同时会计算mipmap纹理。用D3DXFilterTexture函数可以完成这个任务,genTexture方法的实现代码如下: 参见教材P216 14.4 光 照 Terrain::genTexture方法里会调用Terrain::lightTerrain方法,这个方法为地形增加了光照效果,从而使渲染的真实感更强。 为什么要照亮所渲染的地形呢,而且为什么不让Direct3D来处理光照呢?我们自己来进行这种计算会有如下的三个好处: 不用保存顶点法线的信息,节省内存。 由于地形一般是静态的,光源的位置也不会改变,因此预先计算好光照,就可以省下Direct3D实时为地形计算光照的时间。 顺便做一些数学练习,熟悉基本的光照理论,练习使用Direct3D的函数。 14.4.1 概述 这项用来计算地形阴影的光照技术是最基础的技术之一,被称为散射光照技术。设置一个平行光源,并指定它的方向与从光
您可能关注的文档
- 第13章 使用框架.pptx
- 第13章 建筑功能材料.ppt
- 第13章 事务和锁.ppt
- 第12章 综合应用.ppt
- 第13章 事务与数据恢复.ppt
- 第13章 远缘杂交.ppt
- 第13章 其他办公设备.ppt
- 第13章 苗木贮藏与出圃.ppt
- 第12章镧系与锕系元素.ppt
- 第13章-磁力.ppt
- 四川省德阳市罗江中学2025届高三考前热身化学试卷含解析.doc
- 山东省枣庄现代实验学校2025届高三下学期第五次调研考试化学试题含解析.doc
- 吉林省长春市十一高中等九校教育联盟2025届高三一诊考试生物试卷含解析.doc
- 2025届江苏省盐城市伍佑中学高考仿真模拟化学试卷含解析.doc
- 2025届广西贺州中学高考冲刺押题(最后一卷)生物试卷含解析.doc
- 安徽省池州市贵池区2025届高三第一次模拟考试生物试卷含解析.doc
- 宁夏银川一中2025届高三(最后冲刺)化学试卷含解析.doc
- 广东省广州市增城区四校联考2025届高考压轴卷化学试卷含解析.doc
- 2025届邯郸市第一中学高考生物必刷试卷含解析.doc
- 2025届安徽省安庆市石化第一中学高考仿真卷化学试卷含解析.doc
文档评论(0)