Re: [osg-users] Problems with osgUtil::TangentSpaceGenerator

2011-06-29 Thread Guo Chow
Daniel Borchart  writes:

> 
> Hi,
> 
> I'm trying to implement a bump mapping shader. That works well for a simple 
shape like that plane, where I
> define the tangent attribute manually:
> 
> Code:
>   Geometry* plane = new Geometry();
>Vec3Array* vertices = new Vec3Array();
>   Vec3Array* normals = new Vec3Array();
>   DrawElementsUInt* faces = new DrawElementsUInt
(PrimitiveSet::TRIANGLES, 0);
>   Vec3Array* texcoords = new Vec3Array();
>   Vec3Array* tangents = new Vec3Array();
> 
>   vertices->push_back(Vec3f(1.0f, 0.0f, 1.0f));
>   vertices->push_back(Vec3f(-1.0f, 0.0f, 1.0f));
>   vertices->push_back(Vec3f(1.0f, 0.0f, -1.0f));
>   vertices->push_back(Vec3f(-1.0f, 0.0f, -1.0f));
> 
>   normals->push_back(Vec3f(0.0f, -1.0f, 0.0f));
> 
>   texcoords->push_back(Vec3f(1.0f, 1.0f, 1.0f));
>   texcoords->push_back(Vec3f(0.0f, 1.0f, 1.0f));
>   texcoords->push_back(Vec3f(1.0f, 0.0f, 1.0f));
>   texcoords->push_back(Vec3f(0.0f, 0.0f, 1.0f));
> 
>   faces->push_back(0);
>   faces->push_back(1);
>   faces->push_back(3);
>   faces->push_back(3);
>   faces->push_back(2);
>   faces->push_back(0);
> 
>   tangents->push_back(Vec3(-1,0,0));
> 
>   plane->setVertexArray(vertices);
>   plane->setNormalArray(normals);
>   plane->setTexCoordArray(0, texcoords);
>   plane->addPrimitiveSet(faces);
>   plane->setNormalBinding(Geometry::BIND_OVERALL);
> 
>   plane->setVertexAttribData(6, Geometry::ArrayData(tangents, 
Geometry::BIND_OVERALL));
> 
> But for more complex shapes I have to use the TangentGenerator. When I try 
to run this:
> 
> Code:
> ref_ptr tsg = new 
osgUtil::TangentSpaceGenerator();
> tsg->generate(plane, 0);
> 
> I get an "Debug Assertion Failed" with "Expression: vector subscript out of 
range" in generate().
> 
> Did I forget something? I cannot see the fault.
> 
> Daniel
> 
> --
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=35575#35575
> 
> 

Hi Daniel,

I come up against the same problem of utilizing osgUtil::TangentSpaceGenerator 
in the same way. I trace into TangentGenerator.cpp then I find that on line 
223 the subscript of normal array(nx) is out of range when there is only one 
normal in it. TangentSpaceGenerator is assumed to work for normal binding of 
BIND_PER_VERTEX instead of BIND_OVERALL. So you have to set normal for EVERY 
vertex. If I miss something, please let me know.

Guo

___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


[osg-users] Problems with osgUtil::TangentSpaceGenerator

2011-01-12 Thread Daniel Borchart
Hi,

I'm trying to implement a bump mapping shader. That works well for a simple 
shape like that plane, where I define the tangent attribute manually:


Code:
Geometry* plane = new Geometry();
   Vec3Array* vertices = new Vec3Array();
Vec3Array* normals = new Vec3Array();
DrawElementsUInt* faces = new DrawElementsUInt(PrimitiveSet::TRIANGLES, 
0);
Vec3Array* texcoords = new Vec3Array();
Vec3Array* tangents = new Vec3Array();

vertices->push_back(Vec3f(1.0f, 0.0f, 1.0f));
vertices->push_back(Vec3f(-1.0f, 0.0f, 1.0f));
vertices->push_back(Vec3f(1.0f, 0.0f, -1.0f));
vertices->push_back(Vec3f(-1.0f, 0.0f, -1.0f));

normals->push_back(Vec3f(0.0f, -1.0f, 0.0f));

texcoords->push_back(Vec3f(1.0f, 1.0f, 1.0f));
texcoords->push_back(Vec3f(0.0f, 1.0f, 1.0f));
texcoords->push_back(Vec3f(1.0f, 0.0f, 1.0f));
texcoords->push_back(Vec3f(0.0f, 0.0f, 1.0f));

faces->push_back(0);
faces->push_back(1);
faces->push_back(3);
faces->push_back(3);
faces->push_back(2);
faces->push_back(0);

tangents->push_back(Vec3(-1,0,0));

plane->setVertexArray(vertices);
plane->setNormalArray(normals);
plane->setTexCoordArray(0, texcoords);
plane->addPrimitiveSet(faces);
plane->setNormalBinding(Geometry::BIND_OVERALL);

plane->setVertexAttribData(6, Geometry::ArrayData(tangents, 
Geometry::BIND_OVERALL));



But for more complex shapes I have to use the TangentGenerator. When I try to 
run this:


Code:
ref_ptr tsg = new 
osgUtil::TangentSpaceGenerator();
tsg->generate(plane, 0);



I get an "Debug Assertion Failed" with "Expression: vector subscript out of 
range" in generate().

Did I forget something? I cannot see the fault.

Daniel

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





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org