查看: 5280|回复: 18

[TA技术分享] 转:帝国时代OL地表拼接算法

[复制链接]

  离线 

发表于 2013-2-7 14:46:47 | 显示全部楼层 |阅读模式

注册,下载更多游戏资源!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
《帝国时代OL》是2011年底微软发布的即时战略网游版,画面相当华丽。在它发布不久我就研究了它的场景实现方法,这篇文章里所写的内容是2012年1月份研究的,当时写了个场景查看工具,还带有简单的地表编辑功能,但是后来因为其他原因就不再继续下去了,所以也就放着不管了,前阵子整理硬盘才想起还有这段往事。很遗憾的微软已经停止更新《帝国OL》了,也就是前几天的新闻,但是服务器还没关,只是内容不再更新,其实不更新也就意味着离关服不远了。
1.jpg

下面说说它的地表实现方式吧,跟目前流行的做法完全不同,算是自成一派。
照例,一个场景(特指地表)由很多块(或者叫页)组成,每块都是8*8的格子,当然边缘可能不够8*8。每块由很多层组成,每层有三张贴图,一张diffuse,一张normal和一张mask, 示例如下:
2.jpg

最右边的大图是最终的混合结果,这个是没有加法线的效果。
理论上最多支持64层,当然显卡撑不住的,我记得统计过所有的场景,大概最高的是16层好像。

Diffuse和normal比较好理解,这个mask是怎么来的呢?其实这个是实现的重点,下面详解。
背景知识:
1.帝国OL的场景文件是一种类似google protobuf的格式。里面有由很多贴图文件的名字,组成的数组,然后地图数据(长*宽个WORD值)就是这些贴图的索引。
2.在Art.bar包中有个blends.txt,里面记录了两个信息,一个是各种Blender的类型,另一个是贴图混合的层级。层级是指贴图的顺序,比如雪地肯定在泥地之上等等。

有了上面两个信息,我们通过如下方式就可以生成mask贴图了:
1.    初始化为全白
2.    每层独立处理,如果9宫格内没有本层的类型,则不处理
3.    本层以上的不考虑
4.    遍历低层的格子,按下图方式放置本层的blender
3.jpg



通过上面的方式,就可以正确的生成mask了:
4.jpg

看的一头雾水是吧,其实去下个帝国OL的客户端,然后拿帝国3的MOD工具就可以解包,看到那些文件就好理解了,我这里放几个截图,帮助您理解。
blender看起来是这样的,就是一个个小贴图,32*32的。
5.jpg

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.通过一种算法来选择。正解!我感觉类似随机算法,但是每次取值的时候,先设置下种子,目前可以确定的是,这个种子肯定跟格子的坐标有关。
6.jpg

验证的方式很简单,把场景扩大一格,如果这一行或者一列是从原点开始的,则所有的blender都有变化,如果这一行或者一列添加在最后,则原地表不会变化。

最终实现的结果:
7.jpg

8.jpg

9.jpg

10.jpg







回复

使用道具 举报

  离线 

发表于 2013-2-7 14:46:47 | 显示全部楼层
楼主加油,我们都看好你哦。
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-2-10 15:30:33 | 显示全部楼层
{:4_126:}{:4_126:}
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-2-13 21:29:24 | 显示全部楼层
技术贴啊。。。。感谢
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-2-20 10:11:42 | 显示全部楼层
强烈支持楼主ing……
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-3-12 10:22:40 | 显示全部楼层
楼主对地表贴图很有研究……
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-4-27 12:39:14 | 显示全部楼层
谢谢楼主的分析 很不错
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-5-2 15:00:15 | 显示全部楼层
加油楼主!!!!!!!!!
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-5-3 16:04:49 | 显示全部楼层
谢谢分享O(∩_∩)O~
回复 支持 反对

使用道具 举报

  离线 

发表于 2013-9-26 09:00:10 | 显示全部楼层

谢谢分享~~~~{:soso_e100:}
回复 支持 反对

使用道具 举报

点击按钮快速添加回复内容: 支持 高兴 给力 加油 生气 路过 感恩 欢迎 最强
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 联系我们

第九游戏资源网

  • Powered by Discuz! X3.5
  • © 2001-2017 Comsenz Inc.
  • GMT+8, 2024-11-24 08:06 , Processed in 0.052363 second(s), 33 queries , Gzip On, MemCache On.
QQ

 关注第九游戏资源网

快速回复 返回顶部 返回列表