您当前的位置:首页 > 游戏频道 > 网页游戏 > 游戏资讯 > 正文返回列表页

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

编辑:瑞安网 来源:新浪游戏 发表时间:2020-02-18 10:48 人气 | 查看所有评论

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

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

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

  以某第三方自研引擎开发的游戏为例,展示分析过程以及在Unity内重建的效果。

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

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

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

手游逆向分析: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内还原游戏的角色效果。

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

手游逆向分析:Unity内还原游戏场景/角色渲染效果 手游逆向分析:Unity内还原游戏场景/角色渲染效果 手游逆向分析:Unity内还原游戏场景/角色渲染效果 手游逆向分析: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时把截到的骨骼矩阵计算到顶点。

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

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

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

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

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

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

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

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

健康游戏忠告 抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防上当受骗 适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活

  • 作品版权归作者所有,如果无意中侵犯了您的版权,请来信告知,本站将在三个工作日内删除
  • 提示:本站为防止低俗内容出现,用户发表的评论及上传游戏需本站审核后才能显示出来,谢谢