OSG共享顶点数组重复

时间:2014-01-20 18:35:05

标签: qt openscenegraph

我正在使用openscenegraph渲染一个有~9000个顶点的场景。每个Drawable都是一条线(我必须保留它,因为它代表一个“条形”)。所以我在每个setVertexArray()节点上使用具有相同顶点数组的函数Geometry,但使用不同的DrawElementsUInt

总共有12000个可绘制的,我应该有9000个顶点,但我有大约2亿个顶点和两个可绘制的顶点。 (我看到在观众中使用“S”键。)

我有什么办法可以强制drawable使用相同的Array而不是复制它?

我在Qt中使用OSG。

m_vertices是一个osg :: vec3Array *,包含9000个值
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());
}   

1 个答案:

答案 0 :(得分:0)

您似乎没有使用VBO,因此OSG正在制作m_vertices阵列的每个节点副本并将其上传到GPU。

删除该行:

bar->setUseDisplayList(false);

并将其替换为:

bar->setUseVertexBufferObjects(true);

<强>更新

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