Roman,

I see that you are allocating EBOs by hand. If you skip that and just call
setUseVertexBufferObjects(true), OSG will automatically create a single
shared EBO for the osg::Geometry, and put all your PrimitiveSets inside that
shared EBO at various offsets/spans. (I could be mistaken but I think that's
true.) Then you can just create multiple PrimitiveSets and swap in the one
you want drawn at the appropriate time.

I'm not sure why osgparametric creates VBOs and EBOs manually, but I have
not studied it too closely.

Glenn Waldron : Pelican Mapping


On Fri, Jun 11, 2010 at 10:27 AM, Roman Grigoriev <grigor...@gosniias.ru>wrote:

> Hi,
> I have to make in my app dynamic lines. As far as I know display lists are
> deprecated for now on GLES2 platform I try to make it using VBO+EBO, like in
> osgparametric,so now  it works fine.  But I have to draw up to 1000 lines
> with 100 points so it can be so hard to GPU. So I decided to recalculate EBO
> using LOD strategy. So I'll calculate distance to my point and remove odd
> indices. Could you please give me some snippet how to work with EBO in
> update or draw callback?
> Also my lines are trajectories and I have to draw them respectively to
> simulation time. But I found that I can't change size of element buffer.
> Because I found in PrimitiveSet.cpp
> this lines
>
> Code:
>
> void DrawElementsUInt::draw(State& state, bool useVertexBufferObjects)
> const
> {
> .......
>     if (ebo)
>        {
>            if (_numInstances>=1) state.glDrawElementsInstanced(mode,
> size(), GL_UNSIGNED_INT, (const GLvoid *)(ebo->getOffset(getBufferIndex())),
> _numInstances);
>            else glDrawElements(mode, size(), GL_UNSIGNED_INT, (const GLvoid
> *)(ebo->getOffset(getBufferIndex())));
>        }
> }
>
>
>
> so here size() - total size of element buffer and I create for example EBO
> with 200 indices total and want draw only first 100 indices - how can I make
> it?
>
> for the reference here is my code
>
> Code:
>
> osg::Node* createModel( bool dynamic, bool useVBO)
> {
>    osg::Geode* geode = new osg::Geode;
>    osg::Geometry* geom = new osg::Geometry;
>    geode->addDrawable(geom);
>    osg::Vec3 row(0.0f,0.0f,0.0);
>    unsigned int num_x = 200;
>       unsigned int num_y = 20;
>       unsigned int vert_no = 0;
>    osg::Vec3Array* vertices = new osg::Vec3Array( num_x );
>
>        unsigned int iy;
>        for(iy=0; iy<num_x; iy++)
>        {
>        (*vertices)[vert_no++] = row;
>        row.y()=1000.0f*iy;
>        row.z()+=100;
>        }
> geom->setVertexArray(vertices);
> osg::VertexBufferObject* vbo = useVBO ? new osg::VertexBufferObject : 0;
> if (vbo) vertices->setVertexBufferObject(vbo);
> osg::ElementBufferObject* ebo = useVBO ? new osg::ElementBufferObject : 0;
>    osg::DrawElementsUInt* elements = new
> osg::DrawElementsUInt(GL_LINE_STRIP_ADJACENCY_EXT, num_x);
>    unsigned int element_no = 0;
>    for(unsigned int ix = 0; ix<num_x; ix++)
>    {
>        (*elements)[element_no++] = ix;
>    }
>
>    geom->addPrimitiveSet(elements);
>        geom ->setDataVariance(osg::Object::DYNAMIC);
>        geom->setDrawCallback(new DrawCallback());
>    if (ebo) elements->setElementBufferObject(ebo);
> geom->setUseVertexBufferObjects(useVBO);
> return geode;
> }
>
>
>
> ...
>
> Thank you!
>
> Cheers,
> Roman[/code]
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=28826#28826
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to