手游逆向分析<一>: Unity内还原《镇魔曲》场景渲染效果

手游逆向分析<一>: Unity内还原《镇魔曲》场景渲染效果

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

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

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

网易最近上线的MMO手游,几款品质较高,如《天下》《镇魔曲》。其中 《镇魔曲》用的NeoX自研引擎开发。以下就以《镇魔曲》为例展示分析过程以及在Unity内重建的效果。

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


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

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

另外说明一下,高通推出了新的Snapdragon Profiler。老的Adreno Profiler经常崩溃,截取不到完整的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的长度是32米。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根据视锥属性计算得出。

相关链接: 手游逆向分析<二>: Unity内还原《镇魔曲》角色渲染效果