OSG 3.4.0 
I am trying to use "instancing" (starting from the example osgdrawinstanced) to 
draw simple square geometry at multiple locations.
 I am getting all of my instances sitting on top of each other at (0,0,0). That 
is they are not offset to their expected locations.

I know my shader is working OK because if I add a hack to my shader to add in 
an offset that depends on gl_InstanceID then the squares do get "offset" per 
instance.


Step 1 
Add "nInstances" of the square to my osg::Geometry
    geom.addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4, nInstances ) );

Step 2
Create a simple shader program that uses an attribute array of offsets ("d") to 
offset the vertex locations
        std::string vertexSource =
                "#version 120\n"
                "#extension GL_EXT_draw_instanced : enable\n"
                "in vec3 d;\n"
                "void main() \n"
                "{ \n"
                // Use the =coord to translate the position of the vertices.
                        "vec3 pos = vec3(gl_Vertex) + d;\n"
                        "vec4 finalPos = vec4(pos, 1.0);\n"
                        "gl_Position = gl_ModelViewProjectionMatrix * 
finalPos;\n"
                "} \n";

        osg::ref_ptr< osg::Shader > vertexShader = new osg::Shader();
        vertexShader->setType(osg::Shader::VERTEX);
        vertexShader->setShaderSource(vertexSource);

        osg::ref_ptr< osg::Program > program = new osg::Program();
        program->addShader(vertexShader.get());
        ss->setAttribute(program.get(),osg::StateAttribute::ON);

        program->addBindAttribLocation("d", 1);

Step 3
      Create an array of offsets 4 * nInstances that contain the offsets for 
each vertex. Is this where I am going wrong??? I have checked that "d" is not 
(0,0,0) and is varying for each instance. It seems to be that all the instances 
are using  the same offset.
                        osg::Vec3Array *attrib = new osg::Vec3Array;
                        size_t vecIndex = 0;
                        for (size_t i = 0; i < nInstances ; i++) {
                                osg::Vec3 d=GetOffSetForInstance(i);
                                attrib->push_back(d);
                                attrib->push_back(d);
                                attrib->push_back(d);
                                attrib->push_back(d);
                        }
                        geom->setVertexAttribArray(1, attrib);
                        geom->setVertexAttribBinding(1, 
osg::Geometry::BIND_PER_VERTEX);




Andrew

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=69743#69743





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to