osg渲染引擎上手一个月,现在根据自己的理解解析一下osg的状态树和渲染树的建立,和渲染流程。
我下面写的都是框架,具体的内容自己看代码,看代码比什么都有效
状态树和渲染树的建立是在CullVisitor中完成的。
1、CullVisitor这个访问器负责场景的裁剪,简答的说就是把处于视锥体以外的场景裁剪掉(当然可以人为的确定有一些场景始终不会被裁剪),保留下来的这些场景就是需要被绘制的场景。具体的裁剪函数是CullStack::isCulled中完成。
2、void CullVisitor::apply这一组函数负责根据StateSet构建状态树,构建是在pushStateSet中完成的,pushStateSet同时负责渲染树的构建, _currentRenderBin = ss->getNestRenderBins() ? _currentRenderBin->find_or_insert(ss->getBinNumber(),ss->getBinName()) :_currentRenderBin->getStage()->find_or_insert(ss->getBinNumber(),ss->getBinName()); 这个代码就是找到指定的渲染顺序,如果没有就新建一个renderbin,但是他是根据StateSet来创建的,所以你的渲染顺序的StateSet不一定在同一个renderbinz中,这里建的渲染树只有树的的骨架,没有叶子节点
3、void CullVisitor::apply(Geode& node)中,对drawable有一个addDrawableAndDepth(drawable,&matrix,depth);,这里就是给渲染树和状态树添加可渲染的对象。
注意 _currentRenderBin->addStateGraph(_currentStateGraph);只是添加StateGraph,那么RenderBin的RenderLeaf在哪里被添加呢??
注意:RenderBi