既然你已经做出决定要使用地形场景管理器,那么下面介绍的一些东西是你需要知道的。
场景中地形的形状和着色是由高度图、地形纹理和地形细节纹理共同计算而得的。高度图是一张简单的灰阶图,其中每个像素点代表一个高度值,0代表这个地形的地面,255代表最高点。例子中有一个叫做terrain.png的高度图,可以供大家实验用。
一张纹理图伸展开来覆盖整个儿地形。纹理图一般都是棕、绿、白或灰间杂的颜色,对应土地、草地、雪地或者岩石地形。因为地形纹理一般比要覆盖的地形小得多,故而当你距离很近地观察它时,地形一般会看起来比较模糊。为了帮助改善这一点,在近距离观察时,就要用到细节纹理,与地形纹理混合使用。细节纹理并不像地形纹理那样伸展得那么大,仅仅是减弱了近距离观察时产生的地形模糊现象。例子中的terrain_texture.jpg以及 terrain_detail.jpg这两个纹理可供实验使用。
一个地形被分割为一小块儿一小块儿的像地砖一样的地形方块儿,由场景管理器按这些地形块儿的拓扑结构和观察者的距离依照不同的细节层次进行显示。
最后,用一个指定了地形维度的世界坐标空间,将完整的地形投影到一个三维空间中。
目录
1 配置参数
1.1 基本配置参数
1.2 高级配置参数
1.3 更多高级参数
2 使用自定义材质
配置参数
地形场景管理器通过terrain.cfg脚本进行配置。
基本配置参数
这个脚本中的基本参数有:
WorldTexture:指定地形纹理文件的名字。
DetailTexture:指定细节纹理文件的名字。
DetailTile:指定细节纹理在每个地形块儿上重复的次数。例如,如果值为n,那么细节纹理在每个地形块儿中将会以nxn个网格的形式被显示出来。设置这个参数可能需要做一些实验。如果数值设低了,地形可能在近距离观察时会看起来很模糊。如果数值设得太高,地形可能出现距离很远时仍然不断重复匹配图案。
PageSource:指定高度图的源。默认设置是Heightmap。
Heightmap.image:绘制高度图的图像文件。因此必须是一个边长为2^n+1(2的n次方+1)的正方形,n位整数。高度图越大,地形就越详细,但是同时你的程序所耗费的资源也相应越多。(包括程序的启动时间更长。)
PageSize:地形最终会有PageSize x PageSize个顶点。PageSize必须与高度图的边长数值相同,即此数值也是2^n+1,n为整数。
TileSize:地形砖有TileSize x TileSize个顶点。这个数值必须小于PageSize。TileSize的值也必须满足2^n+1,n为整数。地形砖的大小设置得太小严重影响效果,而设置得太大会导致场景中某些部分使用不必要地过高细节,浪费资源。
MaxPixelError:当决定使用LOD时,这一参数指定最大容错值。这个值设得过高会导致地形有接缝。设置得过低会影响效果。
PageWorldX, PageWorldZ:设置在世界坐标系下的地形扩展。地形越大,地形的细节就越低,因为用于地形的顶点数是基于高度图的,而不是世界的大小。这可以被用来将地形伸缩成你想要的大小。
MaxHeight:世界坐标系下,地形的最大高度。高度图0到255的范围,伸缩成世界坐标系下0到MaxHeight。
MaxMipMapLevel:指定渲染地形时用到的细节层次数。距离较远的地形和相对平坦的地形可以使用较低细节渲染。
高级配置参数
一些高度图生成器将数据保存为原(raw)格式而不是图像(image)格式。下面这些参数就是描述原格式的。
Heightmap.raw.size:指定高度图一边的长度。值必须是2^n+1,且n为整数。
Heightmap.raw.bpp:指定文件中每像素是用多少字节表示的。例如,1=8 bits,2=16 bits。
Heightmap.flip:当设置为true,翻转高度图。Required for Terragen heightmaps.
以下参数控制场景管理器的其他操作。
VertexNormals:这个参数让TerrainSceneManager在硬件缓冲区中计算并设置顶点法向。如果使用光照或者需要它的GPU程序,应当打开这个参数。
VertexColours:这个参数让TerrainSceneManager在硬件缓冲区中计算并设置顶点颜色。如果你用到了需要这个信息的GPU程序,就要打开这个参数。
UseTriStrips:当设置为yes,则优化地形三角形送入GPU的顺序,以便送入较少的顶点。(虽然对于大多数新款显卡来说,帧率没什么变化)。因为在某些显卡上可能会导致“裂缝”产生,并且很少甚至没什么性能提升,所以建议还是关掉好。
VertexProgramMorph:如果可以的话,使用定点程序变形LODs。
LODMorphStart:LOD变形开始起效的相应距离范围。这是当前LODs作用范围和下一个更低级别的LOD作用范围之间的距离的一个比例。
更多高级参数
不使用地形纹理和细节纹理渲染地形,你可以给出你自己的渲染方式,特别是用你自己的材质。典型用法就是在材质中提供你自己的顶点程序。
MorphLODFactorParamName:如果VertexProgramMorph设置为yes并且你的自定义材质中包含有一个高级顶点程序,那么使用这个选项。这个参数指定了你想要绑定变形LOD的顶点程序参数名。参数范围时是到1。0(最高)表示没有调整,1 表示完全由变形控制作为下一个低级LOD的同一点。
MorphLODFactorParamIndex:如果VertexProgramMorph设置为yes并且你的自定义材质中包含有一个汇编级的顶点程序,那么使用这个选项。这个选项代表了你想要绑定变形LOD因子的顶点程序参数的索引。参数范围是0到1。0(最高)表示没有调整,1表示完全由变形控制作为下一个低级LOD的同一点。
CustomMaterialName:要定义渲染地形的材质名。
使用自定义材质
你可以使用自定义材质渲染你的地形。如果你的材质包括顶点程序,以下的参数是可以使用的:
位置(positions)
两个纹理坐标集合(0号是世界纹理,1号是细节纹理)
法线,如果启用的话
每顶点delta值,为将一个高一级的LOD变形为低一级的LOD地砖。这是一个像'blend weight'一样的每个顶点都有的浮点数。如果你想使用这个参数,你也必须提供你想接收变形因子的参数的名字或者索引号。
setWorldGeometry()有重载形式,一种用于加载配置文件,另一种我们可在程序中使用,以
达到手工加载的功能。这里,SceneData被 typedef 为std:map,它存储了如我们在terrain.cfg
中看到那些值对。假设我们已经从某个二进制文件读入我们想要的内容到SceneData中。我们要做
的就是把读入的内容转换成setWorldGeometry()需要的类型。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pizi0475/archive/2010/02/23/5319790.aspx