周末花了一天时间在Unity中复刻了一下《海岛奇兵》海岛场景海水的渲染效果,先上目前复刻的效果图:
总体上还原了海水深度、海面波光、海水流动、海岸泡沫的效果。
复刻的思路其实就是拿Adreno Profiler、SnapDragon和Intel GPA进行抓帧,随后分析渲染用到的Shader、uniform参数。
记录一些踩到的坑:
- AdrenoProfiler极容易报错,但是抓到的Resources最完善,但是Mesh中可能某一项属性如Color末尾缺失,导致导出Obj文件缺少数据,需要手动进行修复,比较花费精力。另外AdrenoProfiler导出的Obj是伪Obj文件,需要手动修复格式描述语法。
- SnapDragon要求app的AndroidManifest.xml开启了Debug选项,否则即使连接上真机,也无法在Take Snapshot窗口中启动想要抓帧的app。因此需要在抓帧前在反编译apk添加Debug选项再回编,一般需要配合apktool.jar,但是如果apk开启了安装包MD5自校验,就比较麻烦,腾讯MTP一般都开启了自校验。
- Intel GPA在安卓下只支持x86架构的app,因此一般选择连接x86架构的模拟器抓帧,但是直接连接Android的失败率很高,各种闪退。因此如果使用Intel GPA来抓模拟器,最好配合GraphicsMoniter检测模拟器真正的绘制进程,随后在System Analyzer中直接连接localHost,采用DirectX的方式抓帧,成功率理论上是100%。
- Intel GPA的FrameAnalyzer体验最好,但是导出Obj时不含UV信息等,如果在乎Mesh相关的数据,则只能求助AdrenoProfiler。
- 抓帧抓到的模型坐标系很大概率和Unity不一致,纹理采样、坐标运算等需要进行微调。