2014-01-20 35 views
0

我正在使用openscenegraph渲染具有〜9000顶点的场景。每个Drawable是一条线(我必须保留它,因为它代表一个“酒吧”)。所以我使用功能setVertexArray()与每个Geometry节点上的相同顶点数组,但使用不同的DrawElementsUIntOSG共享顶点数组重复

总共有12000个drawable,我应该有9000个顶点,但是我有大约2000000个顶点和两个drawable。 (我看到在查看器中使用“S”键)。

我有办法强制绘图使用相同的数组,而不是复制它吗?

我在Qt中使用OSG。

m_vertices是一个包含9000个值的osg :: vec3Array *
addBar被称为12000次。

void addBar(osg::Node *geode) 
{ 
    osg::ref_ptr<osg::Geometry> bar = new osg::Geometry; 
    bar.get()->setVertexArray(m_vertices); 
    bar->setUseDisplayList(false); 
    osg::DrawElementsUInt *ids = new osg::DrawElementsUInt(osg::PrimitiveSet::LINES); 
    ids->push_back(/* first Id*/); 
    ids->push_back(/* second id */); 
    bar.get()->addPrimitiveSet(ids); 
    geode->asGeode()->addDrawable(bar.get()); 
} 
+0

向我们显示代码。 – cmannett85

+0

是更好的?我不能显示真正的代码,因为它不是我的财产。 – Brugere

+0

好的,我发现使用'osgFX :: Outline'作为组节点使顶点数加倍。但我仍然有'几何节点的数量*顶点的数量' – Brugere

回答

0

你似乎没有使用维也纳组织,所以OSG正在使m_vertices阵列的每个节点的副本,并上传加时赛的GPU。

所以删除行:

bar->setUseDisplayList(false); 

,取而代之的是:

bar->setUseVertexBufferObjects(true); 

UPDATE:

经过进一步思考,这是不够的。在引擎盖下,OSG只是为每个Geode创建一个单独的VBO--而不是我们想要的。因此,解决方案(根据OSG forums上的这篇文章)创建一个osg::VertexBufferObject并填充您的顶点,然后使用setVertexBufferObject(..)将其添加到osg::Vec3Array(您的m_vertices)。

+0

我只是试过了,我仍然有相同数量的顶点:( – Brugere

+0

是来自我的场景图的问题,它有许多具有所有相同顶点数组的几何节点? – Brugere

+0

@Brugere这就是它的样子,你应该有一个VBO,所有的几何节点都使用它作为它们的顶点源,但是为每一个定义偏移量使用不同的基本集合,我会想到的是上面的内容。 – cmannett85