运行环境
unity 2019.4.0f1
项目需求
uv1 使用于:albedo 纹理的采样坐标
uv2 使用于:ao 纹理的采样坐标
在 unity 下运行没有问题,但是发布程序到 android 后,就发现模型纹理显示异常,看着像是 uv 坐标出了问题:
如:正常情况下:
手机上运行异常情况下:
怀疑问题
打包后一下资源出问题了?
- 纹理资源
- albedo 纹理资源(uv1采样)
- ao 纹理资源(uv2采样)
- uv1 纹理坐标(采样于 albedo)
- uv2 纹理坐标(采样于 ao)
也就是,要么:纹理资源问题、要么:纹理坐标问题
RenderDoc 抓帧分析
经过 RenderDoc 抓真机上的分析,albedo, ao纹理资源和打包前是一模一样的,也就确定了:纹理资源没有问题
那么就怀疑在:uv1, uv2 上出问题了
于是,使用 3Ds max 将原来的 Binary *.fbx导出成 ASCII '.fbx
在 ASCII 上搜索:uv 即可查看到:LayerElementUV: 0 和 LayerElementUV: 1 的关键字
可以看到原来的模型中的uv1, uv2 数据是不一样的,如下图:
然后再 render doc 中可以看到 vs input 的部分中,uv1, uv2 变成一样的了:
解决方案
- 可以关闭使用到了 uv2 的那部分模型的静态合批(确定可行)
- 可以场景将模型中的 uv2 的那部分数据挪去 uv3(待确定),因为 uv2 的话 unity 会有特殊对待为:light map bake 的 uv 来使用,不知道其黑箱处理了什么逻辑~
References
- Combined static batched mesh changes UV coordinates when playing the scene - 2015 年的 issuse,也有人遇到类似的问题