公司3D项目反馈cocos3d模型问题,正常情况,我们的模型如下图,模型的毛发使用透明贴图:
当整体改变透明度改为为 小于100时出现下面情况:
分析后,感觉应该是两个透明物体绘制顺序出错,并且绘制透明物体时,cocos并没有关闭深度写入功能,更改mesh::draw函数如下:
_material->getStateBlock()->setDepthWrite(true);
改为:
if (isTransparent && !forceDepthWrite)
_material->getStateBlock()->setDepthWrite(false);
else
_material->getStateBlock()->setDepthWrite(true);
其中修改部分为cocos注释内容,然而添加后,还是出现上个情况,那就是说这个设置没卵用,cocos这个设置问题应该还有BUG,后期有时间找找他们的问题。没时间给他们找BUG,使用最简单的方式,直接修改c3t文件的顺序:
"nodes": [
"id": "对象037",
"parts": [
{
"meshpartid": "shape1_part3",
}, {
"meshpartid": "shape1_part2",
},{
"meshpartid": "shape1_part1",
}]
]
改为:
"nodes": [
"id": "对象037",
"parts": [
{
"meshpartid": "shape1_part1",
},{
"meshpartid": "shape1_part2",
},{
"meshpartid": "shape1_part3",
}
]
]
我这里测试问题解决,后面反馈设置setGlobalZorder(1)后,程序依然有这个问题,分析只可能是cocos引擎内部强制改变了渲染顺序,查找代码,果然发现了一个小坑:
float globalZ = isTransparent ? 0 : globalZOrder;//这里全局排序的globalZOrder被强制改变了
if (isTransparent)
flags |= Node::FLAGS_RENDER_AS_3D;
_meshCommand.init(globalZ,
_material,
getVertexBuffer(),
getIndexBuffer(),
getPrimitiveType(),
getIndexFormat(),
getIndexCount(),
transform,
flags);
在生成meshCommand过程中,原本的globalZOrder被强制改变了,导致一个物体的不同部分处于不同的globalZorder中,肯定导致渲染顺序出错。坑找到了,但是占时没动,不知道这是官方设计的锅还是cocos开发人员的锅,改动是否会影响其他,先让程序不设置globalZOrder解决这个问题。底层的这些问题,后面打算找个时间统一解决掉。