Cocos MVP 疑惑

//渲染
void Scene::render(Renderer* renderer)
{
    auto director = Director::getInstance();
    Camera* defaultCamera = nullptr;
    const auto& transform = getNodeToParentTransform();

	//遍历所有相机
    for (const auto& camera : getCameras())
    {
        if (!camera->isVisible())
            continue;
        
        Camera::_visitingCamera = camera;
        if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT)
        {
            defaultCamera = Camera::_visitingCamera;
        }
        
        //这里有个疑惑,getViewProjectionMatrix这个函数明明获取的是
        //试图投影矩阵即视图矩阵和投影矩阵的乘积,名字确实投影矩阵
        // /**get view projection matrix*/
    		// const Mat4& getViewProjectionMatrix() const;
        director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());
        camera->apply();
        //clear background with max depth
        camera->clearBackground();
        
        //visit the scene
        //添加渲染命令
        visit(renderer, transform, 0);
        
        //真正的渲染
        renderer->render();
        
        director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
    }
    
    Camera::_visitingCamera = nullptr;
    experimental::FrameBuffer::applyDefaultFBO();
}

2、
渲染命令
void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags)
这里会获取模型变化,我的理解这里获取的是模型变化,并没有视图变换,名字为什么是modelView,我不是很理解。。。
if(flags & FLAGS_DIRTY_MASK)
_modelViewTransform = this->transform(parentTransform);

3、
void Sprite::draw(Renderer renderer, const Mat4 &transform, uint32_t flags)
_trianglesCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, _polyInfo.triangles, transform, flags);
renderer->addCommand(&_trianglesCommand);
精灵的绘制命令
初始化方法:const Mat4& mv这里也是上面疑惑的地方
void TrianglesCommand::init(float globalOrder, GLuint textureID, GLProgramState
glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv, uint32_t flags)

疑问:cocos中的MVP矩阵如何计算的?

名字的确取得很奇怪,cocos为每一个Camera维护一个VP = View * Projection,渲染时遍历每个Camera,取出VP作为当前的MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION(名不副实),
在visit渲染树里,调用精灵的QuadCommand::init, 进一步调用ProgramState的apply
在这里为shader设置mvp = model * VP