- 积分
- 13944
- 注册时间
- 2012-10-13
- 最后登录
- 1970-1-1
- 在线时间
- 小时
- 金币
- 枚
- 资源币
- 枚
- 现金
- 元
- 性别
- 保密
离线
|
注册,下载更多游戏资源!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
《帝国时代OL》是2011年底微软发布的即时战略网游版,画面相当华丽。在它发布不久我就研究了它的场景实现方法,这篇文章里所写的内容是2012年1月份研究的,当时写了个场景查看工具,还带有简单的地表编辑功能,但是后来因为其他原因就不再继续下去了,所以也就放着不管了,前阵子整理硬盘才想起还有这段往事。很遗憾的微软已经停止更新《帝国OL》了,也就是前几天的新闻,但是服务器还没关,只是内容不再更新,其实不更新也就意味着离关服不远了。
下面说说它的地表实现方式吧,跟目前流行的做法完全不同,算是自成一派。
照例,一个场景(特指地表)由很多块(或者叫页)组成,每块都是8*8的格子,当然边缘可能不够8*8。每块由很多层组成,每层有三张贴图,一张diffuse,一张normal和一张mask, 示例如下:
最右边的大图是最终的混合结果,这个是没有加法线的效果。
理论上最多支持64层,当然显卡撑不住的,我记得统计过所有的场景,大概最高的是16层好像。
Diffuse和normal比较好理解,这个mask是怎么来的呢?其实这个是实现的重点,下面详解。
背景知识:
1.帝国OL的场景文件是一种类似google protobuf的格式。里面有由很多贴图文件的名字,组成的数组,然后地图数据(长*宽个WORD值)就是这些贴图的索引。
2.在Art.bar包中有个blends.txt,里面记录了两个信息,一个是各种Blender的类型,另一个是贴图混合的层级。层级是指贴图的顺序,比如雪地肯定在泥地之上等等。
有了上面两个信息,我们通过如下方式就可以生成mask贴图了:
1. 初始化为全白
2. 每层独立处理,如果9宫格内没有本层的类型,则不处理
3. 本层以上的不考虑
4. 遍历低层的格子,按下图方式放置本层的blender
通过上面的方式,就可以正确的生成mask了:
看的一头雾水是吧,其实去下个帝国OL的客户端,然后拿帝国3的MOD工具就可以解包,看到那些文件就好理解了,我这里放几个截图,帮助您理解。
blender看起来是这样的,就是一个个小贴图,32*32的。
blends.txt的内容是这样的:
Name newdefault
Corner 1 blends\blendcorner
Corner 1 blends\blendcorner2
Edge 1 blends\blendedge
Edge 1 blends\blendedge4
Edge 1 blends\blendedge5
Edge 1 blends\blendedge6
Edge 1 blends\blendedge7
TwoEdges 1 blends\blendtwoedges
LShape 1 blends\blendLShape
LShape 1 blends\blendLShape2
LShapeCorner 1 blends\blendLShapeCorner
LShapeCorner 1 blends\blendLShapeCorner2
TwoCorners 1 blends\blendtwocorners
TwoOppositeCorners 1 blends\blendtwooppositecorners
ThreeCorners 1 blends\blendthreecorners
FourCorners 1 blends\blendfourcorners
EdgeCorner 1 blends\blendedgecorner
EdgeTwoCorners 1 blends\blendedgetwocorners
UShape 1 blends\blendushape
Circle 1 blends\blendcircle
Circle 1 blends\blendcircle2
Circle 1 blends\blendcircle3
BlendOrder
Roman\RetainingCliffEdge_df
Roman\Road1_df
Roman\Road2_df
Greek\MudDirt01_df
Egyptian\CliffDesertTop_df
Greek\CliffCoastTop_df
Greek\CliffInlandTop_df
Celt\AlpsCliffTop_df
Celt\RaidCliffSide_df
Celt\RaidCliffTop_df
Celt\CliffSide41_df
Celt\CliffTop44_df
Celt\CliffSide48_df
Minoan\CliffTop51_df
Minoan\CliffSide52_df
Minoan\CliffSide51_df
大概明白了吧。其实还有一个问题,从上的图可以看出,同一种类型的blender其实不只一个,每种类型都有4,5个,那生成地表的时候选择哪个呢?
有几个推论:
1.完全随机选择。不对的,因为每次进同一个场景,地表是完全一样的,不可能是随机的。
2.地表里存了这些数据。我几乎把场景文件格式全解析出来了,但是非常确定的是场景文件里没有存这个信息。
3.通过一种算法来选择。正解!我感觉类似随机算法,但是每次取值的时候,先设置下种子,目前可以确定的是,这个种子肯定跟格子的坐标有关。
验证的方式很简单,把场景扩大一格,如果这一行或者一列是从原点开始的,则所有的blender都有变化,如果这一行或者一列添加在最后,则原地表不会变化。
最终实现的结果:
|
|