3.x Scene::render(...)疑问

我在layer上加了一个background sprite (zOrder=0),然后又加了一个layer2 (zOrder=1),其中layer2使用了自定义相机camera2。
本想让layer2显示在background sprite前面,但显示结果却是background会挡住layer2。
开始不解,然后去看引擎代码,发现此结果是Scene::render(…)函数的逻辑造成:
Scene::render(…)的逻辑是先用自定义相机去渲染使用它的相应节点,最后再用default相机渲染使用它的相应节点。
所以导致无论zOrder怎么设,都会先渲染使用自定义相机的layer2,然后再渲染使用默认相机的background sprite。
于是为了能够先渲染background sprite再渲染layer2,我只好又定义了一个camera1,让background sprite改为使用camera1(并且保证camera1是在camera2之前加到Scene:: _cameras中,即camera1先于camera2加到场景中),这样渲染效果就正常了。

虽然能解决问题,但是感觉很不自然。想问官方Scene::render(…)函数逻辑规定成这样是出于什么考虑?关于此问题是否有更优雅的解决办法?

为了方便看,附上Scene::render(…)代码:

void Scene::render(Renderer* renderer)

{

auto director = Director::getInstance();

Camera* defaultCamera = nullptr;

for (const auto& camera : _cameras)

{

    Camera::_visitingCamera = camera;

    if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT)

    {

        defaultCamera = Camera::_visitingCamera;

        continue;

    }

    

    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());

    

    //visit the scene

    visit(renderer, Mat4::IDENTITY, 0);

    renderer->render();

    

    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

}

//draw with default camera

if (defaultCamera)

{

    Camera::_visitingCamera = defaultCamera;

    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());

    

    //visit the scene

    visit(renderer, Mat4::IDENTITY, 0);

    renderer->render();

    

    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);

}

Camera::_visitingCamera = nullptr;

}

曹,我3.4的貌似也是,自定义相机的内容被默认相机的内容覆盖,靠,居然没人管你,这论坛还有救吗

3.5beta已经做了调整,加入顺序设置depth,可以设置不同的值,控制顺序,default相机depth默认是0.
default相机是为了和之前的2D机制兼容,和一般的3D游戏一样,最后的相机,基本是UI的,放在最后画。