zoukankan      html  css  js  c++  java
  • Ogre1.7地形浅析

    come from: http://blog.csdn.net/qq18052887/article/details/6819633

    早在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

  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/zengqh/p/2687457.html
Copyright © 2011-2022 走看看