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