Hi,
I'm trying to set up an interior scene by using the model of Sibenik Cathedral,
then filling it with 8 lights and shadows, but my efforts fall rather short so
far. Without shadows the scene looks pretty much like everything is set up
alright, but when I enable ShadowMap technique, not only do the walls turn all
black, but the actual visible shadows look rather off too. Could anyone please
take a look at my code and come up with any kind of suggestion regarding what I
might be doing wrong? Any help greatly appreciated.
My IndoorScene class derived from ShadowedScene:
Code:
IndoorScene::IndoorScene()
{
Group* sceneGroup = NULL;
Node* sibenikNode = NULL;
MatrixTransform* sibenikScaleXform = NULL;
Geode* lightMarkerGeode = NULL;
Group* lightGroup = NULL;
StateSet* lightStateSet = NULL;
LightSource* lightSources[8] = {NULL};
ShadowMap* shadowMap = NULL;
sceneGroup = new Group;
sibenikNode = readNodeFile("sibenik.osg");
Matrix sibenikScaleMatrix;
sibenikScaleMatrix.makeScale(5.0f, 5.0f, 5.0f);
sibenikScaleXform = new MatrixTransform;
sibenikScaleXform->setMatrix(sibenikScaleMatrix);
lightMarkerGeode = new Geode;
lightMarkerGeode->addDrawable(new ShapeDrawable(new Sphere(Vec3f( 9.0f,
1.5f, 2.0f), 0.2f)));
... lightMarkerGeode->getOrCreateStateSet()->setMode(GL_LIGHTING,
StateAttribute::OFF);
lightStateSet = sceneGroup->getOrCreateStateSet();
Light* light1 = new Light;
light1->setLightNum(0);
light1->setPosition(Vec4f(9.0f, 1.5f, 1.75f, 1.0f));
light1->setAmbient(Vec4f(0.5f, 0.5f, 0.5f, 1.0f));
light1->setDiffuse(Vec4f(0.9f, 0.9f, 0.9f, 1.0f));
light1->setConstantAttenuation(1.0f);
lightSources[0] = new LightSource;
lightSources[0]->setLight(light1);
lightSources[0]->setLocalStateSetModes(StateAttribute::ON);
lightSources[0]->setStateSetModes(*lightStateSet, StateAttribute::ON);
... (likewise for other lights) ...
lightGroup = new Group;
for (int i = 0; i < 8; i++)
{ // zoskupenie svetiel
lightGroup->addChild(lightSources[i]);
}
shadowMap = new ShadowMap;
setShadowTechnique(shadowMap);
addChild(sceneGroup);
sceneGroup->addChild(sibenikScaleXform);
sibenikScaleXform->addChild(sibenikNode);
sibenikScaleXform->addChild(lightMarkerGeode);
sibenikScaleXform->addChild(lightGroup);
Optimizer optimizer;
optimizer.optimize(this);
}
Some screens for additional information - before shadows:
i . imgur . com / OMarm71.png
... and after Shadows:
i . imgur . com / dpKuxmW.png
Thank you!
Cheers,
Martin
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=52634#52634
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org