[osg-users] ShadowMap problem...

Wyatt Earp wyattbsearp1881 at gmail.com
Tue Nov 10 11:27:19 PST 2009


I have taken the code I think I need from the osgShadow example and tried to
add shadows to my existing application.    The problem is that the shadow
map displayed in the debug window is just a gray-ish circle centered on a
white-ish background, nothing at all what  I expected and no details that
look anything like the objects in my scene.  This remains the same
regardless of whare I put my light source.  Any suggestions?  

 

My code is as follows:

W

 

 

osgViewer::CompositeViewer viewer;

osgViewer::View* view = new osgViewer::View;

viewer.addView(view);

view->setUpViewInWindow(50, 50, currentWidth, currentHeight, 0);

 

osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new
osgShadow::ShadowedScene;

 

shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);

shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);

 

osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;

shadowedScene->setShadowTechnique(sm.get());

 

int mapres = 1024;

sm->setTextureSize(osg::Vec2s(mapres,mapres));

 

m_World = new osg::Group;

 

// add some things to m_World.. Removed for brevity sake

 

 

// get the bounds of the model.

osg::ComputeBoundsVisitor cbbv;

m_World->accept(cbbv);

osg::BoundingBox bb = cbbv.getBoundingBox();

 

osg::Vec4 lightpos;

 

viewer.getView(0)->getEventHandlers().push_front(new
osgViewer::StatsHandler);

viewer.getView(0)->getEventHandlers().push_front(mykey);

 

std::vector<osg::Camera*> cameras;

viewer.getCameras(cameras);

cameras[0]->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR
);

cameras[0]->setProjectionMatrixAsPerspective(40.0, 1.333333333, 1.0,
SKYDOME_RANGE*1.1f);

 

bool postionalLight = true;

if (postionalLight)

{

    lightpos.set(bb.center().x(), bb.center().y(), bb.zMax() +
bb.radius()*2.0f  ,1.0f);

}

else

{

    lightpos.set(0.5f,0.25f,0.8f,0.0f);

}

 

osg::ref_ptr<osg::LightSource> ls = new osg::LightSource;

ls->getLight()->setPosition(lightpos);

 

shadowedScene->addChild((osg::Node*)m_World);

shadowedScene->addChild(ls.get());

 

bool updateLightPosition = true;

 

viewer.realize();

 

viewer.getView(0)->setSceneData(shadowedScene.get());

 

 bool debugHUD = true;

 

if(debugHUD)

{

    osgViewer::Viewer::Windows windows;

    viewer.getWindows(windows);

 

    if (windows.empty()) return 1;

 

    osgShadow::ShadowMap* sm =
dynamic_cast<osgShadow::ShadowMap*>(shadowedScene->getShadowTechnique());

    if( sm ) { 

       osg::ref_ptr<osg::Camera> hudCamera = sm->makeDebugHUD();

 

       // set up cameras to rendering on the first window available.

       hudCamera->setGraphicsContext(windows[0]);

       hudCamera->setViewport(0,0,windows[0]->getTraits()->width,
windows[0]->getTraits()->height);

 

       viewer.getView(0)->addSlave(hudCamera.get(), false);

    }

}

 

// display the help

key->showHelp();

 

while( !viewer.done() )

{

    cameras[0]->setViewMatrix(key->getViewMat());

 

    if (updateLightPosition)

    {

        float t = viewer.getFrameStamp()->getSimulationTime();

        if (postionalLight)

        {

            lightpos.set(bb.center().x()+sinf(t)*bb.radius(),
bb.center().y() + cosf(t)*bb.radius(), bb.zMax() + bb.radius()*3.0f  ,1.0f);

        }

        else

        {

            lightpos.set(sinf(t),cosf(t),1.0f,0.0f);

        }

 

        ls->getLight()->setPosition(lightpos);

 

        osg::Vec3f lightDir(-lightpos.x(),-lightpos.y(),-lightpos.z());

 

        lightDir.normalize();

        ls->getLight()->setDirection(lightDir);

    }

 

    viewer.frame();

}

 

 

 

I also must add that I am using my own shaders and have reproduced the
shadowmap shader code as follows:

 

 

uniform sampler2D osgShadow_baseTexture;

uniform sampler2DShadow osgShadow_shadowTexture;

uniform vec2 osgShadow_ambientBias;

 

vec4 myCalculations() 

{

   // Details Omitted;

}

 

void main (void)

{

   //  My shader code details omitted

 

   // shadow mapping

   vec4 color = gl_Color * texture2D( osgShadow_baseTexture,
gl_TexCoord[0].xy );

   gl_FragColor = color * (osgShadow_ambientBias.x + shadow2DProj(
osgShadow_shadowTexture, gl_TexCoord[1] ) * osgShadow_ambientBias.y);

}

 

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20091110/bc821c59/attachment.htm>


More information about the osg-users mailing list