手游逆向分析: Unity内还原游戏场景/角色渲染效果

作者:大星星 2020-02-12
这里说的分析过程,不仅仅是简单的使用截帧工具。因为只给美术提供截帧获得的Draw Call数和模型的面数,参考意义不大,美术依然无法了解游戏制作方法和流程。本文展示的方案包括截取游戏的各种数据,开发工具提取和分析数据,然后再导入到自己用的引擎里,复现其渲染效果。根据以往的一些经验,如果用的是同一款引擎,复现效果可以达到100%。如果使用的引擎不一样,复现效果也可以达到视觉上没有明显差异。

以某第三方自研引擎开发的游戏为例,展示分析过程以及在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 buffer,index buffer和API events分析提取调试工具,根据不同的顶点缓冲格式信息提取模型,最后再写一个FBX导出插件,把obj文件转成Unity可用的assets。最后,Shader的还原,这方面只有靠经验和人肉翻译了。



以上是Unity内复盘后Scene视口的效果。可推测出具体的一些制作细节:

1.地形以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内还原游戏的角色效果。

首先看真机效果和还原效果对比。





上面第一张带UI的是游戏截图,第二张是分析后Unity内还原效果,第三四张是还原的角色近景。

GPU数据的截取使用高通和Nvidia的工具。模型的提取转化需要注意的地方有:

1,因为高通的profiler截取的顶点数据经常丢失,相关buffer用Tegra Debugger去截。

2,Unity导入切线时会自动normalize,而NeoX引擎的模型会用切线的长度记录信息,同时FBX,unity对单个uv不能同时支持四个通道,所以自己写工具处理FBX文件时需要做一个trick:用两套uv对切线进行编解码。

3,骨骼动画采用GPU计算,而Unity在CPU计算。为了方便展示,模型需要带有骨骼动画pose,这个在导出FBX时把截到的骨骼矩阵计算到顶点。


材质Shader人肉翻译,解析提取后总结如下:

1,角色分为三部分,身体,头部和头发绘制(不包括武器道具)。

2,角色光照。实时光包括一盏平行光和点光源,预计算Spherical Harmonics Diffuse对角色补光,美术可以通过参数修改lighting的占比,以及再打一盏平行光补光,避免出现明暗剧烈过渡。

3,头发的SH Lighting在顶点计算,身体的SH Lighting在像素计算。

4,角色的Spherical Harmonics Diffuse在展示界面和场景内设置是不一样的,但是在同一个场景内,SH都是一样的。反射则是静态的,永远保持不变。

5,服装金属部分,采用GGX BRDF模型。

6,皮肤部分3S的表现主要是对diffuse进行线性warp处理。

7,头发各向异性效果,通过brdf+副法线方向上对反射的多次扰动实现。


附:腾讯光子工作室群技术美术组招聘 Shading Tech Artist(含实习生,长期有效)


作者:大星星
专栏地址:https://zhuanlan.zhihu.com/p/26215257

最新评论
暂无评论
参与评论