3D 半透明 渲染队列 排序错误bug

void RenderCommand::init(float globalZOrder, const cocos2d::Mat4 &transform, uint32_t flags)
{
_globalOrder = globalZOrder;
if (flags & Node::FLAGS_RENDER_AS_3D)
{
if (Camera::getVisitingCamera())
// bugfix transform 这个矩阵是转入View空间的矩阵 直接取矩阵的 14 z坐标 就是 到摄像机的距离
//_depth = Camera::getVisitingCamera()->getDepthInView(transform);
_depth = -transform.m[14];

    set3D(true);
}
else
{
    set3D(false);
    _depth = 0;
}

}

transform 这个矩阵是Local空间转View空间的矩阵 所以直接取矩阵的下标14 就是 View空间的 z坐标 作为深度使用就对了

_depth = Camera::getVisitingCamera()->getDepthInView(transform);这段代码的原意应该是 希望transform矩阵是Local空间转World空间的矩阵 但是外面的代码 Sprite3D::visit 这个函数里面转入的是 Local转View的矩阵 所以这个矩阵在经过getDepthInView函数取得值没有几何意义

希望对做3D的朋友有帮助

1赞