cocos 3D的的透明问题,模型中存在两个透明物体时透明混乱

公司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解决这个问题。底层的这些问题,后面打算找个时间统一解决掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值