Hello everyone, I'm trying to use stencils and I'm not sure what I'm
missing. Basically I have two quads in my scene. I want the quad two to set
the stencil buffer to 1, and I want the quad one to be visible only where
the stencil buffer is not 1.

So far I am getting the result which I want if I don't clear the stencil
buffer. Of course in that case when I rotate the scene using the viewer,
the stencil buffer gets painted to 1's(because of the quad two) and I don't
see the quad one even on places where quad two is not positioned anymore.

However when I clean the stencil buffer(see below), I don't get the result
that I want.

> viewer->getCamera()->setClearMask(GL_COLOR_BUFFER_BIT |
> GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

In this case both of the quads are visible. I'm suspecting that the stencil
buffer gets cleared before the stencil check is done.

Here is a part of my code where I set the stencils.

> osg::ref_ptr<osg::PositionAttitudeTransform> transform_one = new
> osg::PositionAttitudeTransform();
> osg::ref_ptr<osg::PositionAttitudeTransform> transform_two = new
> osg::PositionAttitudeTransform();
> transform_one->addChild(createQuad());
> transform_two->addChild(createQuad());
> transform_two->setScale(osg::Vec3(0.5, 0.5, 0.5));
> transform_two->setPosition(osg::Vec3(0.25, 0.2, 0.25));
>
> // --- Begin stencil related stuff
> osg::ref_ptr<osg::StateSet> ss_one = transform_one->getOrCreateStateSet();
> osg::ref_ptr<osg::StateSet> ss_two = transform_two->getOrCreateStateSet();
> osg::ref_ptr<osg::Stencil> stencil_one = new osg::Stencil();
> osg::ref_ptr<osg::Stencil> stencil_two = new osg::Stencil();
> stencil_two->setFunction(osg::Stencil::ALWAYS, 1, ~0u);
> stencil_two->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP,
> osg::Stencil::REPLACE);
> stencil_one->setFunction(osg::Stencil::NOTEQUAL, 1, ~0u);
> stencil_one->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP,
> osg::Stencil::KEEP);
> ss_one->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
> ss_two->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
> osg::ref_ptr<osg::ColorMask> cm_one = new osg::ColorMask();
>
// I play with the parameters below to see the position of the quad two

cm_one->setMask(false, false, false, false);
> ss_two->setAttribute(cm_one);
> ss_two->setAttributeAndModes(stencil_two, osg::StateAttribute::ON |
> osg::StateAttribute::OVERRIDE);
> ss_one->setAttributeAndModes(stencil_one, osg::StateAttribute::ON |
> osg::StateAttribute::OVERRIDE);


Any help would be appreciated, I am sure I'm missing something really basic
:)
Thanks
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to