[osg-users] [HELP] Properly using osg::VertexAttribDivisor for basic geometry instancing

Julien Valentin julienvalentin51 at gmail.com
Wed Aug 1 07:32:37 PDT 2018


Hi
perhaps it's because of transaltion array 's default binding (UNDEFINED)
try
translation->setArrayBinding(Array::PER_VERTEX)
Cheers


ppsychrite wrote:
> hello sorry if i did this wrong but i dont know how to use mailing lists
> 
> so ive been trying to do modern glsl/opengl 3.3+ with osg::Geometry and 
> osg::Stateset and it's been working OK for basic triangle except for 
> implementing instanced array data
> am I doing it the wrong way? here's the .cpp code for it and for me it 
> seems well enough and fine, position and color works fine
> 
> 
> 	osg::Vec3 coords[] = {
> 		{ -0.05f,0.05f,0.f },
> 		{ 0.05f,-0.05f,0.f },
> 		{ 0.05f,0.05f,1.f }
> 	};
> 	osg::Vec3 colors[] = {
> 		{1.f,0.f,0.f},
> 		{0.f,1.f,0.f},
> 		{0.f,0.f,1.f}
> 	};
> 
> 	osg::Vec2 instancetranslations[] = {
> 		{ 0.0f, 0.0f },
> 		{ 0.1f, 0.0f },
> 		{ 0.2f, 0.0f }
> 	};
> 
> 	osg::Vec3Array *pos = new osg::Vec3Array(sizeof(coords) / 
> sizeof(osg::Vec3), coords);
> 	osg::Vec3Array *color = new osg::Vec3Array(sizeof(colors) / 
> sizeof(osg::Vec3), colors);
> 	osg::Vec2Array *translation = new 
> osg::Vec2Array(sizeof(instancetranslations) / sizeof(osg::Vec2), 
> instancetranslations);
> 
> 	osg::Geometry *vao = new osg::Geometry();
> 	vao->setUseDisplayList(false);
> 	vao->setUseVertexArrayObject(true);
> 	vao->setUseVertexBufferObjects(true);
> 
> 	vao->setVertexAttribArray(0, pos, osg::Array::BIND_PER_VERTEX);
> 	vao->setVertexAttribArray(1, color, osg::Array::BIND_PER_VERTEX);
> 	vao->setVertexAttribArray(2, translation);
> 
> 	vao->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, 3, 3)); //3 
> instances
> 
> 	osg::ref_ptr<osg::Program> program = new osg::Program;
> 
> 	program->addShader(osgDB::readShaderFile("shaders/basic.vert"));
> 	program->addShader(osgDB::readShaderFile("shaders/basic.frag"));
> 
> 	osg::StateSet *stateset = geom->getOrCreateStateSet();
> 	stateset->setAttributeAndModes(program.get());
> 	stateset->setAttribute(new osg::VertexAttribDivisor(2, 1)); //set 3rd 
> array as per-instance
> 
> here's the vertex shader code for it:
> 
> 
> #version 330 core
> layout (location = 0) in vec3 aPos;
> layout (location = 1) in vec3 aColor;
> layout (location = 2) in vec2 aTrans;
> 
> out vec3 color;
> 
> void main()
> {
> color = aColor;
> gl_Position = vec4(aPos.x+ aTrans.x,aPos.y+ aTrans.y,aPos.z,1.0);
> }
> 
> 
> aTrans doesn't move the triangle at all, it's just one. I know it isn't 
> the shaders fault because instead of adding aTrans to aPos I've done 
> (gl_InstanceID * 0.1f) and it's worked perfectly, seeing 3 instanced 
> triangles
> 
> what am i doing wrong/how could i get per-instanced array working?
> 
> 
> 
> 
> 
> _______________________________________________
> osg-users mailing list
> 
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> 
>  ------------------
> Post generated by Mail2Forum


------------------------
Twirling twirling twirling toward freedom

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







More information about the osg-users mailing list