Ogre1.7地形浅析

11 篇文章 0 订阅

早在1年前,就想好好研究一下Ogre1.7的新地形,但是各种原因导致现在我才下载了Ogre1.73的源码进行研究。而且只能在业余时间研究,

Ogre的以前地形一直被人诟病,根本无法用于游戏,于是Ogre爱好者只好自己实现一些地形插件来解决这个问题,比如ETM之类。在国内,比较成功的就是天龙八部的地形系统。我对天龙的研究算是比较精通,他的地形效率上我也改进了不少,但是不能实现splatting和LOD的地形,始终不是一个令人满意的地形。

大概看了下新的地形,功能上远远超出了我的想象,很是兴奋啊。主要功能如下:

1)基于四叉树的顶点LOD

2)基于shader model 2.0的多重纹理混合技术

3)实时编辑功能,可以编辑高度和刷纹理,地形lightmap和normalmap自动生成。我准备利用业余时间用QT做一个地形编辑器玩玩。

4)场景物体的阴影支持PSSM,Ogre终于正式把shader实现的shadow map 加入到项目中了。

5)分页组件,暂时不感兴趣,对我来说,做一个512*512的地形就已经足够大了。

----------------------------------------------------------------------------------------------------------------------------------------------

我主要就整个地形的顶点构建和纹理混合来研究下:

1)地形的构建

以一个terrainSize为513的Terrain为例子,他应该分成多少个tile呢?

由maxBatchSize这个参数决定,numTiles = (terrainSize-1) / (maxBatchSize-1)

加入maxBatchSize = 65,那么地形分成8*8的地形tile,一个tile 64*64的顶点,

maxBatchSize这个参数,一般默认为65,最大为129,为什么最大为129而不是257呢,因为Ogre为了显卡的通用性,采用16为顶点索引

索引数量不能超过2的16次方,如果顶点为257*257就超过呢。。。想起我的项目,就遇到这样的问题,导致有些不支持32为顶点索引的显卡,看不到模型。

minBatchSize这个参数决定了tile的size在减少到某个程度后应该和周围得3个兄弟tile合并成一个tile,一般来说,这个值不要和maxBatchSize差距太多倍

因为Ogre只是在最小LOD的时候才会和周围3个兄弟tile合并成一个tile,而不会在中间的LOD级别合并的,

maxBatchSize = 65,minBatchSize, = 33的情况下 我们看下图吧:

 

最近的情况下,2个房子所在的这个tile为64*64,每个tile周围有一圈东西围着,那个叫skirt技术,用来遮盖每个不同LOD级别的tile之间产生的缝隙的。

 

 

 

 

 

 

摄像机远了一点,tile变成32*32了,因为minBatchSize = 32,32不会和周围3个兄弟tile合并,如果再小,就要合并了。

 

最远的情况下,所有tile都合并成一个32*32的tile了,

 

这2个值怎么设置效率最好,要看地形大小的,大家可以去自己试试看。

 

worldSize ,地形和纹理都有worldSzie这个参数,表示的是世界坐标系的的大小,这个值是决定缩放大小的,

比如worldSize 12000, 缩放 = 12000 / 512 = 24

纹理的worldSize也是缩放,相当于材质脚本中得缩放。

2)纹理的混合

Ogre采用shader model 2.0 来实现的多重纹理混合,支持SM2.0的独显最大支持16层纹理的混合,有些intel的坑爹集显,号称支持SM2.0,结果最大纹理层数也只有4层。。。简单说,要想运行这个地形,老显卡肯定是不行了,

一般的人都觉得Ogre地形支持8层纹理混合,但是实际操作发现最多怎么只有6层有效果,且听我慢慢道来。

因为Ogre的1层是用2张纹理,第一张是diffuse / specular 前3个通道RGB保存diffuse信息,就是实际纹理,后一个A通道保存specular信息

第2张纹理normal / height 前3个通道RGB保存法线贴图的信息,实现法线贴图,后一个A通道保存高度信息,实现视差贴图,反正第2张纹理就是给你实现次世代技术用得,不管你用不用,材质中的纹理单元他都会占用了。

所以理论上最多支持8层啊,但是实际上为什么只有6层,因为一共16张纹理,材质中最多16个纹理单元,还要包括其他一些纹理的

1.全局color map       1张            丰富化地形的图,作用类似于顶点颜色,可以不要

2.全局normal map    1张            保存地形法线的数据,必须要得

3.lightmap                 1张           保存地形自己产生的阴影 ,建议保留

4.阴影的纹理            1张到N张,如果用得是PSSM,张数等于split的数量,默认是3张,开销真大啊,建议保留

5.belnd maps           1到2张     RGBA每个通道都保存的是每层混合的alpha数据,如果用了5层,那么需要4层的混合数据,那么1张正好RGBA4个通道,

6.layer textures        16减去上面的张数  layer textures才是我们真正用到的地表纹理了,所剩不多了,更坑爹的是1个layer还要2张纹理,

我建议的纹理分配方案是:

normalmap + lightmap + PSSM + blendmap + 5层

1+1+3+1+5*2 = 16

所以一个地形,5个layer,是最合理的,什么?你还嫌弃layer少,我告诉你吧

魔兽世界的地形是4张地表+1张混合纹理, 4个layer,那么需要3个alpha混合数据,混合纹理最后一个通道保存阴影数据的。

我们5张不同地表,比魔兽世界还多一张呢。。。完全刷出效果来啊

实在不行可以去掉PSSM,这样可以有6个layer。

所以,5到6个layer才是Ogre地形支持的真正数据,

 

3)纹理混合的优化:composite map

上面那么多张纹理吓死人了,但是实际上,只有高LOD细节的tile才需要这个清晰的纹理

如果是离得远,那么就会用一张composite map贴上去完事,composite map就是混合了上面16张纹理的所有效果所产生的一张纹理,

到底多远才用composite map,不是靠LOD决定的,而是靠这个参数mTerrainGlobals->setCompositeMapDistance(3000);

默认3000距离。

 

---------------------------------------------------------------------------------------------------------------------------------------------

由于是浅析,所以就写到这里了,了解了sinbad的设计思路和一些参数的意思,配置地形就容易了,我就不再写如何配置地形了哇。

有个帅锅写得很清晰了:http://www.cnblogs.com/lancidie/archive/2011/06/19/2084490.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值