OSG 共享顶点数组重复



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

总共有 12000 个可绘制对象,我应该有 9000 个顶点,但我有大约 200 000 000 个顶点和两倍的可绘制对象。(我看到在查看器中使用"S"键)。

我可以做些什么来强制可绘制对象使用相同的数组而不是复制它?

我在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());
}   

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

因此,请删除该行:

bar->setUseDisplayList(false);

并将其替换为:

bar->setUseVertexBufferObjects(true);

更新:

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

最新更新