只有这个模型有这个问题?换个模型试试看还有没有?
有可能是顶点数据/索引数据有问题。
如果确定是某个模型的问题,用blender等软件重新导出试试能不能修复
不是,是所有的模型都有问题,我使用了 GPU instance
模型有开启网格压缩这些东西吗
没有开的,h5 和 微信小游戏上正常
换个高级工程师终于解决了,在自己不擅长的领域,有AI帮手是真的好。
1. Android 出现黑色长线/三角形
原因:
Cocos Creator 3.8.8 原生端 createMesh 在处理 customAttributes 时存在顶点步长计算问题。合并特效的自定义属性 a_animData0
使用 RGBA32F,但原生端错误地参考了前一个普通属性的格式,造成顶点数据错位。
GPU 随后读取到错误的顶点位置或索引数据,三角形被拉伸到屏幕远处,于是出现黑色长线。Web/编辑器路径没有触发同样的问题。
解决:
- 在自定义属性前增加同为 RGBA32F 的 colors 普通属性。
- 为每个顶点写入完整的 [1, 1, 1, 1] 颜色。
- 使原生端即使错误引用前一个属性格式,得到的步长仍与 a_animData0 一致。
这样消除了顶点数据错位,黑线不再出现。
2. 运行一段时间后头部、身体依次消失
原因:
角色的真实位置没有写入 node.position,而是通过实例化属性:
a_transData1
a_transPos
a_transRot
在 Shader 中计算。
因此存在两个位置:
- GPU 看到的角色:位于不断向前移动的逻辑位置。
- CPU 看到的模型包围盒:仍停留在角色出生点附近。
随着相机向前移动,出生点附近的包围盒离开相机视锥,原生端便认为模型不可见并停止提交渲染。头部和身体是不同的
MeshRenderer/SkinnedMeshRenderer,包围盒大小不同,所以表现为头先消失、身体随后消失。
解决:
- 仅在原生平台让角色根节点低频跟随逻辑位置。
- CPU 包围盒因此始终位于角色附近,视锥裁剪结果恢复正确。
- GPU 依然通过实例属性计算精确位置,没有破坏原有实例化合批。
- 使用距离阈值更新,而不是每帧更新所有节点 Transform。
最终效果是:GPU 实例化位置、CPU 包围盒和相机裁剪重新保持一致,同时保留原有合批性能。
1赞
版本打算什么时候放出来
