2020-01-25 17:06:32 登录注册 RSS

当前位置: 公理网 >> 曝光信息 >> cocos3D的的透明问题,模型中存在两个透明物体时透明混乱

cocos3D的的透明问题,模型中存在两个透明物体时透明混乱
发布时间:01-13| 来源:公理网 | 点击发表评论

公司3D项目反馈cocos3d模型问题,正常情况,我们的模型如下图,模型的毛发使用透明贴图:

20190320101244648.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmczNzEzNzI=,size_16,color_FFFFFF,t_70"/>

当整体改变透明度改为为小于100时出现下面情况:

????????????????20190320101704300.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmczNzEzNzI=,size_16,color_FFFFFF,t_70"/>

分析后,感觉应该是两个透明物体绘制顺序出错,并且绘制透明物体时,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引擎内部强制改变了渲染顺序,查找代码,果然发现了一个小坑:

floatglobalZ=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解决这个问题。底层的这些问题,后面打算找个时间统一解决掉。
点赞
收藏
分享

授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.046868(s) query 6, 报料QQ:点击这里

给我发消息