osg 的状态树和渲染树

本文介绍了osg渲染引擎中的状态树和渲染树的构建过程,包括CullVisitor如何进行场景裁剪,如何通过StateSet建立状态树和渲染树的骨架,并在apply(Geode& node)中添加可渲染对象。特别指出,RenderBin的RenderLeaf转化和渲染排序在特定函数中完成,最终在osgUtil::RenderStage的draw和RenderBin::draw中实现绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值