After some serious digging and tweaking inside osgShadow::ShadowMap I
have come up with a partial workaround for this problem. The problem
seems to boil down to issues around the pushing and popping of
statsets containing instance of:

new osg::Uniform("osgShadow_shadowTexture",(int)_shadowTextureUnit);

ShadowMap uses a default value of 1 for _shadowTextureUnit

It seems that for geometries that have no texture assigned, I need to
set a value of  0 to _shadowTextureUnit, otherwise I get problems (as
least I do on my Radeon-X300)

So... my partial workaround is to setup my scene like:
osgShadow::ShadowMap* shadowMap = new osgShadow::ShadowMap();
shadowMap->setTextureUnit(0);
shadowedScene->setShadowTechnique(shadowMap);

For scenes that do not have textures, this is a perfect workround for
me, but for scenes containing textured AND untextured objects,
unfortunately the workround causes the textures to be lost.

I wonder if the PROPER solution to the problem requires some kind of
stateset override for nodes that is a function of whether the node has
textures?

Intersectingly the problem is a little bit bigger that I thought, as
untextured objects in shadowed scenes have strange artifacts on their
surfaces unless I setTextureUnit to zero (even the first time the
scene is assigned)

Is this info useful to anyone that actually knows what they are doing?
I'm begining to feel a bit out of my z-depth. ;-)

Chris.


On 02/11/2007, Chris Denham <[EMAIL PROTECTED]> wrote:
> Hmm... think this might me a video card/driver specific problem.
> I just tried this test on my colleague's PC that has a matrox video
> card and seemed to work ok.
> Oh rats.... does that mean it not so easy/impossible to fix the problem? :-(
> Chris.
>
>
> > Date: Thu, 1 Nov 2007 17:56:06 +0000
> > From: "Chris Denham" <[EMAIL PROTECTED]>
> > Subject: [osg-users] Scene renders black when replacing a
> >        ShadowedScene
> > To: osg-users@lists.openscenegraph.org
> >
> > I'm getting a problem when assigning a new shadowed scene to the viewer.
> > What seems to happen is that once the first scene has been rendered,
> > the assignment of a new shadowed scene results in a everything in the
> > scene being drawn black. Also odd is the fact that there doesn't seem
> > to be a problem when a texture is assigned to objects being drawn.
> >
> > I have created a minimal example that exhibits the problem, and pasted
> > it below.
> > Any ideas what's going wrong? Can anyone reproduce the effect?
> >
> > [I'm using osg2.2 on windowsXP with Radeon X300 with latest drivers.]
> >
> > ----------------------------------------------------------------------------------------------------
> > #include <osg/ShapeDrawable>
> > #include <osg/Geode>
> > #include <osgGA/TrackballManipulator>
> > #include <osgShadow/ShadowedScene>
> > #include <osgShadow/ShadowMap>
> > #include <osgDB/ReadFile>
> > #include <osgViewer/Viewer>
> >
> > const int ReceivesShadowTraversalMask = 0x1;
> > const int CastsShadowTraversalMask = 0x2;
> >
> > osg::Node* createShadowedScene(bool withTexture)
> > {
> >    osgShadow::ShadowedScene* shadowedScene = new osgShadow::ShadowedScene;
> >    
> > shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
> >    shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);
> >    shadowedScene->setShadowTechnique(new osgShadow::ShadowMap());
> >
> >    osg::LightSource* lightSource = new osg::LightSource;
> >    lightSource->getLight()->setPosition(osg::Vec4(0, 0.2, 1, 0));
> >
> >    osg::ShapeDrawable * shape = new osg::ShapeDrawable(new
> > osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), 200.0));
> >    shape->setColor(osg::Vec4(0.8f, 0.8f, 0.8f, 1.0f));
> >    osg::Geode* geode = new osg::Geode();
> >    geode->addDrawable(shape);
> >
> >    if (withTexture)
> >    {
> >        geode->getOrCreateStateSet()->setTextureAttributeAndModes( 0,
> > new osg::Texture2D(osgDB::readImageFile("Images/lz.rgb")),
> > osg::StateAttribute::ON);
> >    }
> >
> >    shadowedScene->addChild(geode);
> >    shadowedScene->addChild(lightSource);
> >
> >    return shadowedScene;
> > }
> >
> > int main(int argc, char** argv)
> > {
> >        bool withTexture = false;
> >
> >    osgViewer::Viewer viewer;
> >    viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
> >        viewer.setCameraManipulator(new osgGA::TrackballManipulator());
> >    viewer.realize();
> >
> >    viewer.setSceneData(createShadowedScene(withTexture));
> > #if 1
> >        // Drawing the frame then assigning a new shadowed scene
> >        // seems to result in scene being rendered black.
> >        // Although, seems ok when texture is assigned to the object.
> >        viewer.frame();
> >        viewer.setSceneData(createShadowedScene(withTexture));
> > #endif
> >
> >        viewer.run();
> >
> >    return 0;
> > }
> >
> > #endif
> >
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to