2014-01-20 3 views
0

Я использую openscenegraph для рендеринга сцены с ~ 9000 вершин. Каждый Drawable - это строка (я должен хранить ее, поскольку она представляет «бар»). Поэтому я использую функцию setVertexArray() с тем же массивом вершин на каждом узле Geometry, но использую другой DrawElementsUInt.OSG shared vertex array duplicated

Имея в общей сложности 12000 рисунков, я должен иметь 9000 вершин, но у меня есть около 200 000 000 вершин и вдвое больше рисунков. (Я вижу, что с помощью клавиши «S» в средстве просмотра).

Я могу что-то сделать, чтобы заставить рисовать использовать тот же массив и не копировать его?

Я использую OSG в Qt.

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

Покажите нам код. – cmannett85

+0

- это лучше? Я не могу показать реальный код, поскольку это не моя собственность. – Brugere

+0

ОК, я понял, что использование «osgFX :: Outline» в качестве группового узла удваивает число вершин. Но у меня все еще есть «количество узлов геометрии» число вершин. – Brugere

ответ

0

Вы, кажется, не использовать РВО, так OSG делает на узел копию m_vertices массива и загрузки его объект на GPU.

Так удалить строку:

bar->setUseDisplayList(false); 

И заменить его:

bar->setUseVertexBufferObjects(true); 

UPDATE:

При дальнейшем размышлении, это не достаточно. Под капотом OSG просто создает отдельный VBO для каждого Geode - не то, что мы хотим. Таким образом, решение (согласно этому сообщению на OSG forums) создает osg::VertexBufferObject и заполняет его вашими вершинами, а затем добавляет его в osg::Vec3Array (ваш m_vertices), используя setVertexBufferObject(..).

+0

Я просто попробовал, и у меня все еще есть такое же количество вершин :( – Brugere

+0

- проблема, возникающая из моего сценария, который имеет множество узлов геометрии со всем одним и тем же массивом вершин? – Brugere

+0

@Brugere Вот как это выглядит. У вас должен быть один VBO, который использует все вершины геометрии в качестве источника вершин, но с другим примитивным набором для каждого определения смещения. Который я бы подумал, что это делает. – cmannett85

Смежные вопросы