OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。
数据分页:在城市三维场景中可以采用数据分页的方式进行动态调度。这里“分页”的意思是随着视口范围的变化,场景只加载和渲染当前视口范围内数据,并将离开视口范围内的数据清除内存(可以设定不同的数据卸载策略),不再渲染。保证内存中只有有限的数据量,场景的每一帧也只有有限的数据被送到图形渲染管道,从而提高渲染性能。
动态调度:OSG源代码中提供PagedLOD来进行模型的动态调度。在不同的视域下,PagedLOD动态读取不同细节层次的结点模型,实现了分页LOD显示。OSG内部采用osgDB::DatabasePager类来管理场景结点的动态调度,场景循环每一帧的时候,会将一段时间内不在当前视图范围内的场景子树卸载掉,并加载新进入到当前视图范围的新场景子树。OSG采用了多线程的方式来完成上述工作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
osg::LOD是OpenSceneGraph中的一个节点类,用于控制场景中不同级别的细节。LOD代表"Level of Detail",即细节级别。它允许我们在不同距离和视角下显示不同的几何体,以提高场景的性能和视觉效果。 在使用osg::LOD时,需要创建一个osg::Switch节点,并将不同级别的osg::Node节点添加到其中。然后,将osg::Switch节点作为osg::LOD节点的子节点添加到场景图中。osg::LOD节点有一个距离范围数组,每个范围关联一个osg::Switch节点。当相机进入某个距离范围时,osg::LOD节点会自动切换到相应的osg::Switch节点,从而显示相应的几何体。 以下是一个简单的osg::LOD用法示例: ```cpp // 创建不同级别的几何体 osg::ref_ptr<osg::Geode> geode1 = createGeode1(); osg::ref_ptr<osg::Geode> geode2 = createGeode2(); osg::ref_ptr<osg::Geode> geode3 = createGeode3(); // 创建Switch节点,并将几何体添加到其中 osg::ref_ptr<osg::Switch> switchNode = new osg::Switch(); switchNode->addChild(geode1); switchNode->addChild(geode2); switchNode->addChild(geode3); // 创建LOD节点,并设置距离范围 osg::ref_ptr<osg::LOD> lodNode = new osg::LOD(); lodNode->addChild(switchNode, 0, 100); // 当距离小于100时,显示第一级几何体 lodNode->addChild(switchNode, 100, 500); // 当距离在100到500之间时,显示第二级几何体 lodNode->addChild(switchNode, 500, FLT_MAX); // 当距离大于500时,显示第三级几何体 // 将LOD节点添加到场景图中 osg::ref_ptr<osg::Group> root = new osg::Group(); root->addChild(lodNode); ``` 需要注意的是,osg::LOD节点的距离范围是按照从小到大的顺序排列的。在上面的示例中,当距离小于100时,将显示第一级几何体;当距离在100到500之间时,将显示第二级几何体;当距离大于500时,将显示第三级几何体。如果范围没有重叠,那么osg::LOD节点将只显示其中一个距离范围内的osg::Switch节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值