【踩坑记录】Unity WebGL端角色衣服与身体穿模?竟是大世界坐标浮点精度在搞鬼
前言
最近项目打包 WebGL 端遇到了一个非常诡异的问题:角色模型的衣服和身体出现了大面积穿透、贴合错位,视觉上就像衣服 “嵌” 进了身体里,严重时甚至直接破面。但同样的资源、同样的代码,打 PC 包一切正常,编辑器下运行也毫无问题。
先后排查了 Shader 兼容、蒙皮权重、纹理压缩、深度写入等十几个常见 WebGL 坑点,都没有解决。最终定位结果让人大跌眼镜:问题根源是角色处于距离世界原点约 3386 单位的大坐标位置,WebGL 端的浮点精度不足引发了灾难性的顶点计算误差。
本文完整复盘整个排查过程与原理分析,给同样踩坑的同学做个参考。
一、问题现象
平台差异明显:Unity 编辑器、PC Standalone 包运行完全正常,WebGL 包角色关节处普遍穿模,衣服与身体错位严重
视觉特征:并非贴图破碎花屏,而是几何层面的穿插,衣服顶点整体偏移,紧身服装表现尤为明显
范围特征:场景中静态建筑、地面、道具看起来都正常,只有带多网格蒙皮的角色出现问题
伴随现象:视角转动时穿模位置会有细微跳动,部分顶点边缘有明显 “锯齿错位” 感
最初一直误以为是模型制作问题、Shader 深度写入失效或者蒙皮权重降级,走了很多弯路。
二、根因定位:大世界坐标下的浮点精度灾难
2.1 浮点精度的基本原理
计算机用浮点数表示坐标时,数值越大,能表示的最小精度间隔就越大。这就像尺子的刻度,离原点越远,刻度越稀疏。