节点渲染顺序

来源:互联网 发布:mac如何导出iphone照片 编辑:程序博客网 时间:2024/05/20 17:25
节点渲染顺序
void Engine::stepFrame()中处理update与render,先看render。
render要做的就是从scene的rootNode开始渲染。
我们约定parentNode zorder为0,childeNode 越小越先渲染。childeNode zorder为负时,比parentNode还要先渲染。
对于每个childeNode,也是这样的顺序,这里是一个递归调用。
render()
{
NegativeChildRender();
renderNow();
positiveChildRender();
}

具体代码:
void Engine::stepFrame(){if (_updateDesignSize){Renderer::getInstance()->resetProjection();_updateDesignSize = false;}//updatedrawScene();Renderer::getInstance()->renderQuad();}void Engine::drawScene(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);if(_SceneManager.size() > 0){Scene * scene =  _SceneManager.back();scene->visit();}Renderer::getInstance()->visit();}

void Scene::visit(){_root.visit();}

void Node::visit(){int i = 0;if(!_children.empty()){sortAllChildren();// draw children zOrder < 0for(i = 0 ; i < _children.size(); i++ ){auto node = _children.at(i);if ( node && node->getZOrder() < 0 )node->visit();elsebreak;}// self drawthis->render();for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)(*it)->visit();}else{this->render();}}void Node::render(){}void Node::sortAllChildren(){if( _reorderChildDirty ) {std::sort( std::begin(_children), std::end(_children), nodeComparisonLess );_reorderChildDirty = false;}}

void Sprite::initQuad() {_blendFunc = BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);memset(&_quad, 0, sizeof(_quad));int x1 = -_textureSize.width * 0.5f ;int x2 = _textureSize.width * 0.5f;int y1 = -_textureSize.height* 0.5f ;int y2 = _textureSize.height* 0.5f;_quad.tl._position = Vec3(x1, y2, 0);_quad.bl._position = Vec3(x1, y1, 0);_quad.tr._position = Vec3(x2, y2, 0);_quad.br._position = Vec3(x2, y1, 0);_quad.tl._color = Color::WHITE;_quad.bl._color = Color::WHITE;_quad.tr._color = Color::WHITE;_quad.br._color = Color::WHITE;_quad.tl._texCoord = Vec2(0,1);_quad.bl._texCoord = Vec2(0,0);_quad.tr._texCoord = Vec2(1,1);_quad.br._texCoord = Vec2(1,0);}void Sprite::render(){Size winSize = Engine::getInstance()->getDesignSize();_quadCommand.init(&_quad,_textureID,1,_blendFunc,_model);Renderer::getInstance()->addQuadCommand(&_quadCommand);}







0 0