在Unity中复刻《海岛奇兵》海水渲染

周末花了一天时间在Unity中复刻了一下《海岛奇兵》海岛场景海水的渲染效果,先上目前复刻的效果图:

总体上还原了海水深度、海面波光、海水流动、海岸泡沫的效果。

复刻的思路其实就是拿Adreno Profiler、SnapDragon和Intel GPA进行抓帧,随后分析渲染用到的Shader、uniform参数。

记录一些踩到的坑:

  1. AdrenoProfiler极容易报错,但是抓到的Resources最完善,但是Mesh中可能某一项属性如Color末尾缺失,导致导出Obj文件缺少数据,需要手动进行修复,比较花费精力。另外AdrenoProfiler导出的Obj是伪Obj文件,需要手动修复格式描述语法。
  2. SnapDragon要求app的AndroidManifest.xml开启了Debug选项,否则即使连接上真机,也无法在Take Snapshot窗口中启动想要抓帧的app。因此需要在抓帧前在反编译apk添加Debug选项再回编,一般需要配合apktool.jar,但是如果apk开启了安装包MD5自校验,就比较麻烦,腾讯MTP一般都开启了自校验。
  3. Intel GPA在安卓下只支持x86架构的app,因此一般选择连接x86架构的模拟器抓帧,但是直接连接Android的失败率很高,各种闪退。因此如果使用Intel GPA来抓模拟器,最好配合GraphicsMoniter检测模拟器真正的绘制进程,随后在System Analyzer中直接连接localHost,采用DirectX的方式抓帧,成功率理论上是100%。
  4. Intel GPA的FrameAnalyzer体验最好,但是导出Obj时不含UV信息等,如果在乎Mesh相关的数据,则只能求助AdrenoProfiler。
  5. 抓帧抓到的模型坐标系很大概率和Unity不一致,纹理采样、坐标运算等需要进行微调。

你可能感兴趣的:(图形学,Unity,逆向工程,抓帧,Unity,渲染,图形学)