破解手游《镇魔曲》以及在Unity内复现其效果

作者工作经历涉及自研和商业引擎开发及技术美术,日常工作的一部分是在项目预研初期,破解市面上最新的竞品游戏,提供美术资源制作的参考样板。例如: 给FPS项目破解过现代战争5,LBS项目破解Pokemon Go, ARPG项目破解地牢猎手5。

 

这里说的破解,不仅仅是简单的使用截帧工具。因为只给美术提供截帧获得的Draw Call数和模型的面数,参考意义不大,美术依然无法了解对方的游戏制作方法和流程。本文展示的方案包括截取游戏的各种数据,开发工具提取和分析数据,然后再导入到自己用的引擎里,复现其渲染效果。通过这个重构过程可以了解对方的美术效果制作方法和流程,一定程度上估测对方的研发实力。

 

根据以往的一些破解经验,如果对方和自己用的是同一款引擎,复现效果可以达到100%。如果使用的引擎不一样,复现效果也可以达到视觉上没有明显差异。

 

网易最近上线了一波MMO手游,其中有几款品质比较高的作品。前段时间先后破解了其中的《天下》《镇魔曲》的效果。两款游戏都是网易自研引擎开发的,天下用的是Messiah, 《镇魔曲》用的NeoX。

 

《镇魔曲》采用2.5D视角,所以渲染效果要比《天下》好很多,而且破解难度更大,以下就以《镇魔曲》为例展示破解以及在Unity内重建的效果。

 

先对比下《镇魔曲》手机上最高画质效果和破解的Unity内复盘效果。带UI的截图是真机游戏第一个战斗场景画面。

 

 

 

 

下图是在Unity内复现整个场景的效果。

 

 

 

 

在破解工具的选择上,考虑到获取真机上准确的数据,排除使用Nsight,GPA和模拟器。最终使用Adreno Profiler和Tegra Graphics Debugger,测试机选用MI3和MI Pad。

 

另外说明一下,高通推出了新的Snapdragon Profiler。老的Adreno Profile经常崩溃,截取不到完整的Draw Call。原因是随着高品质游戏出现,profiler已经无法准确判断顶点缓冲里的数据格式。

 

老版本profiler还是拿简单的顶点格式去套用到新游戏上,所以经常会出现异常。新的Snapdragon Profiler干脆直接把存顶点数据的功能给去掉了,以保证其稳定性。但是减少了profiler一个重要的截取功能。

 

这点也可以说明《天下》和《镇魔曲》的品质区别,《天下》是基本的顶点格式,所以可以用profiler工具直接存vertex data出来,《镇魔曲》顶点格式复杂,profiler不仅在draw call中会报错,而且还丢失部分数据。

 

但是每个设备厂商的profiler截帧取到的现场数据是完整的,只是无法提供正确的分析结果。针对这个问题的解决方案是自己开发一套vertex buffer,index buffer和API events分析提取调试工具,根据不同的顶点缓冲格式信息提取模型,最后再写一个FBX导出插件,把obj文件转成Unity可用的assets。最后,Shader的还原,这方面只有靠经验和人肉翻译了。

 

 

 

 

 

 

 

以上是Unity内复盘后Scene视口的效果。这里不再举draw call数,模型面数和贴图大小这些基本数据,主要列下复盘过程中可推测出《镇魔曲》具体的一些制作细节:

 

1、Neox的场景制作有自己的场景编辑器。地形以Tile为单位,每个Tile的长度是320米。Tile分三层,每层有albedo和法线贴图,根据一张Mask贴图做混合。示例场景用了5个Tile。其中一个完整的Tile,其他四个Tile是面积很小的碎片。

 

2、场景支持天气系统,分别支持雨天和雪天。可以通过材质参数控制雨雪在地面上的厚度表现。

 

3、每个模型物件分两个顶点缓冲。第一个缓冲记录位置,法线,切线和两套UV,第二套UV为lightmap uv。第二个缓冲是用编辑器烘培上去的,记录的信息有: a) lightmap的编码映射数据,uv寻址信息,b)模型的世界坐标矩阵, 传入shader内计算。这样做有利于draw call的合批。

 

4、植被分两种,带动画和无动画的。

 

5、模型材质的Lod分两种,高画质采用基础的金属度物理渲染模型(Physical-based Shading),使用到albedo,metallic, normal和lightmap贴图,比如视野范围内的石像。

 

相比较《天下》,少了对环境反射贴图的烘培和支持。低画质采用简单的albedo diffuse加Lightmap,比如视野范围远处的房屋古建和浮岛。类似浮岛这种独立于Tile之外的场景没有合批,世界矩阵还是单个传入pipeline。这种方式符合《镇魔曲》2.5D视角设计。

 

6、光源采用一盏平行光主光源,最多支持四个点光源。对比《天下》缺少了对聚光灯的支持。示例场景中实际使用了平行光产生diffuse,另外加了一盏点光源。点光源挂在角色的身上,跟随运动。这也是游戏截图和Unity复原图中光影细微差别的原因。因为两帧角色站立的位置不一样。

 

7、示例场景一共使用了6张1024的lightmap。

 

8、支持两种雾效,1)高度雾和距离雾混合 2)使用贴图的体积雾。《镇魔曲》最高画质使用的是第一种。

 

9、天空盒模型挂在摄像机上,跟随其运动。世界坐标在Shader根据视锥属性计算得出。

 

最后,后继工作会完善下工具,还原角色材质表现以及通过连续帧截取提取骨骼动画文件。



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)

最新评论