查看: 2090|回复: 7

关于osgocclusionquery这个例子的疑问

[复制链接]

该用户从未签到

发表于 2009-12-28 16:11:32 | 显示全部楼层 |阅读模式
稍稍改了一下,做了一下实验
osg::ref_ptr<osg::Node>
createStockScene()
{
// Create a simple box occluder
// 创建简单的盒子遮挡
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild( createBox().get() );
// Create a complex mess of triangles as a child below an
//   OcclusionQueryNode. The OQN will ensure that th
// 创建大量复杂的三角形作为OcclusionQueryNode的子结点。这个OQN会保证子结点不可见的时候不被渲染。
//   subgraph isn't rendered when it's not visible.
//osg::ref_ptr<osg::OcclusionQueryNode> oqn = new osg::OcclusionQueryNode;
//oqn->addChild( createRandomTriangles( 20000 ).get() );
//root->addChild( oqn.get() );
root->addChild( createRandomTriangles( 20000 ).get());

return root.get();
}
int _tmain(int argc, _TCHAR* argv[])
{
osg::ref_ptr<osg::Node> root = createStockScene().get();
osgViewer::Viewer* viewer = new osgViewer::Viewer();
// osgUtil::Optimizer optimizer ;
// optimizer.optimize(root) ;
viewer->addEventHandler(new osgViewer::StatsHandler);
osg::ref_ptr<osgGA::TrackballManipulator> trackball = new osgGA::TrackballManipulator();
viewer->setCameraManipulator(trackball);
viewer->getCamera()->setCullingMode(osg::CullSettings::NO_CULLING);
viewer->setSceneData(root);
viewer->realize();
viewer->run();
return 0 ;
}

一开始我只是没用遮挡查询节点,发现移到盒子的背面,帧速率明显提高了,可能是由于有默认遮挡的缘故,然后加了setCullingMode(osg::CullSettings::NO_CULLING)后,可移到盒子背面,帧速率还是明显提高。理论上来说,应该不做任何遮挡了,在盒子背面和盒子正面帧速率应该是一样的,可为什么会出现这样的情况呢?

还有一个问题,OSG某人的遮挡模式是什么?是DEFAULT_CULLING?

该用户从未签到

发表于 2009-12-28 16:37:33 | 显示全部楼层
OSG默认的遮挡方式是DEFAULT_CULLING=VIEW_FRUSTUM_SIDES_CULLING|SMALL_FEATURE_CULLING|SHADOW_OCCLUSION_CULLING,但是要注意的是,OpenGL默认开启的背面裁减也会对裁减方式有显著的影响,如果您已经移动到那些三角形的背面,那么帧速率也会有显著提高;如果想关闭这一特性,可以设置GL_CULL为GL_FALSE

该用户从未签到

 楼主| 发表于 2009-12-28 17:32:03 | 显示全部楼层
2# array

加了root->getOrCreateStateSet()->setAttributeAndModes(new osg::CullFace,osg::StateAttribute::OFF);还是没用,依然会剔除,不会渲染。
很奇怪,用了setCullingMode(osg::CullSettings::NO_CULLING)和setAttributeAndModes(new osg::CullFace,osg::StateAttribute::OFF)为什么被盒子挡住后还会渲染,那OcclusionQueryNode的意义何在?

该用户从未签到

发表于 2009-12-29 08:23:39 | 显示全部楼层
  1. root->getOrCreateStateSet()->setAttributeAndModes(new osg::CullFace,osg::StateAttribute::OFF);
复制代码
很显然您写错了,不是设置属性,而是setMode(GL_CULL, OFF)

OcclusionQueryNode的意义是实现了场景中的遮挡查询(即封装了glBeginQuery,glEndQuery等一系列系列函数)。它与OccluderNode的作用类似,但是后者是完全通过几何计算实现遮挡裁减的,而OcclusionQueryNode则是通过OpenGL扩展来完成的。

您感到它没起作用,一种可能是您的显卡根本不支持遮挡查询,另一种可能是您的测试方法存在问题

该用户从未签到

 楼主| 发表于 2009-12-29 09:31:19 | 显示全部楼层
4# array

这样加对吗?root->getOrCreateStateSet()->setMode(GL_CULL_FACE,  osg::StateAttribute::OFF);可还是没用啊。

我的意思是即使不使用OcclusionQueryNode和OccluderNode,OSG的某种机制也会做遮挡剔除,在使用了setCullingMode(osg::CullSettings::NO_CULLING)和setMode(GL_CULL_FACE,  osg::StateAttribute::OFF)的情况下,依然会做遮挡剔除。

该用户从未签到

发表于 2009-12-29 10:03:19 | 显示全部楼层
“OSG的某种机制也会做遮挡剔除”,不存在这样的机制,这一点可以非常肯定和明确地告诉您。

该用户从未签到

 楼主| 发表于 2009-12-29 10:14:27 | 显示全部楼层
6# array
那为什么会出现试验中的情况呢?

该用户从未签到

发表于 2009-12-29 10:51:10 | 显示全部楼层
您没有充分说明自己遇到的情况,我是无法判断的;您可以自行排查一下,不必假设什么“某种机制也会做遮挡剔除”,OpenGL不会允许这种默认的影响场景效率的情形发生
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表