我正在使用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());
}
答案 0 :(得分:0)
您似乎没有使用VBO,因此OSG正在制作m_vertices
阵列的每个节点副本并将其上传到GPU。
删除该行:
bar->setUseDisplayList(false);
并将其替换为:
bar->setUseVertexBufferObjects(true);
<强>更新强>
经过进一步反思,这还不够。在引擎盖下,OSG只是为每个Geode创建一个单独的VBO - 而不是我们想要的。所以解决方案(根据OSG forums上的这篇文章)创建了一个osg::VertexBufferObject
并用顶点填充它,然后使用顶点将其添加到osg::Vec3Array
(您的m_vertices
) setVertexBufferObject(..)
。