Re: [osg-users] Fwd: Strange osgShadow appearance of multiple models self-shadowing under a point light

2017-06-28 Thread michael kapelko
Hi.
I can't say anything about your specific problems, but I had wrong shadows
when small objects were outside larget objects, i.e. if there's a plane and
a ball, and ball is outside the plane, the shadows were sometimes wrong.
To test my assumption, you can add a model with a plane that is underneath
*everything* in the scene and a wall that is heigher than *everything* in
the scene.

2017-06-27 23:14 GMT+07:00 Bris Li :

> Hi all,
>
> It's a problem with osgShadow.
> I hava a scene with multiple pagedLOD models bundled in a group. The
> models are tiles of a city, and each tile is a single model (buildings are
> not separeted with terrain).
> I uses the code in the osgShadow example for shadowing, and put a point
> light in _shadowedScene. The models shadow on themselves.
>
> As the attached image shows, the shadow result is partially correct. In
> some particular angle range from the light source, the correct shadow is
> casted. But in the other range, shadow is not cast correctly, but some
> strange shadows appear which I guess is casted from the model at the other
> side.
> Also, if I put the light on one side of the building, the other side of it
> is still lit, no shadow showing.
> I have tried different shadow implementations, but the results remain
> almost the same.
>
> I can't figure out what is happening since the shadow is just 'partially'
> abnormal. Stuck here for days.
>
> Thanks.
>
> Regards,
> tqjxlm.
>
> osg version 3.4.0.
> code:
> 
> 
> -
> *Shadow*
>  // arguments
>  char* argv[] = {
> "--vdsm",
> "--positionalLight",
> "--ortho",
> "--parallel-split",
> "--num-sm",
> "4",
> "--cascaded"
> };
>
> int argc = sizeof(argv) / sizeof(argv[0]);
>
> // use an ArgumentParser object to manage the program arguments
> osg::ArgumentParser arguments(, argv);
>
> // get the viewer
> osgViewer::View& viewer = getViewer();
>
> // init shadowed scene
> _shadowedScene = new osgShadow::ShadowedScene;
> osgShadow::ShadowSettings* settings = _shadowedScene->getShadowSettings();
> settings->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
> settings->setCastsShadowTraversalMask(CastsShadowTraversalMask);
>
> double distance;
> if (arguments.read("--max-shadow-distance", distance))
> {
> settings->setMaximumShadowMapDistance(distance);
> }
>
> // choose shadow map implementation
> osg::ref_ptr msm = NULL;
> if (arguments.read("--no-shadows"))
> {
> OSG_NOTICE << "Not using a ShadowTechnique" << std::endl;
> _shadowedScene->setShadowTechnique(0);
> }
> else if (arguments.read("--stsm"))
> {
> osg::ref_ptr st = new
> osgShadow::StandardShadowMap;
> _shadowedScene->setShadowTechnique(st.get());
> }
> else if (arguments.read("--pssm"))
> {
> int mapcount = 3;
> while (arguments.read("--mapcount", mapcount));
> osg::ref_ptr pssm = new
> osgShadow::ParallelSplitShadowMap(NULL, mapcount);
>
> int mapres = 1024;
> while (arguments.read("--mapres", mapres))
> pssm->setTextureResolution(mapres);
>
> while (arguments.read("--debug-color")) { pssm->setDebugColorOn(); }
>
>
> int minNearSplit = 0;
> while (arguments.read("--minNearSplit", minNearSplit))
> if (minNearSplit > 0) {
> pssm->setMinNearDistanceForSplits(minNearSplit);
> }
>
> int maxfardist = 0;
> while (arguments.read("--maxFarDist", maxfardist))
> if (maxfardist > 0) {
> pssm->setMaxFarDistance(maxfardist);
> std::cout << "ParallelSplitShadowMap : setMaxFarDistance(" << maxfardist
> << ")" << std::endl;
> }
>
> int moveVCamFactor = 0;
> while (arguments.read("--moveVCamFactor", moveVCamFactor))
> if (maxfardist > 0) {
> pssm->setMoveVCamBehindRCamFactor(moveVCamFactor);
> }
>
> double polyoffsetfactor = pssm->getPolygonOffset().x();
> double polyoffsetunit = pssm->getPolygonOffset().y();
> while (arguments.read("--PolyOffset-Factor", polyoffsetfactor));
> while (arguments.read("--PolyOffset-Unit", polyoffsetunit));
> pssm->setPolygonOffset(osg::Vec2(polyoffsetfactor, polyoffsetunit));
>
> _shadowedScene->setShadowTechnique(pssm.get());
> }
> else if (arguments.read("--ssm"))
> {
> osg::ref_ptr sm = new osgShadow::SoftShadowMap;
> _shadowedScene->setShadowTechnique(sm.get());
> }
> else if (arguments.read("--vdsm"))
> {
> while (arguments.read("--debugHUD")) settings->setDebugDraw(true);
> if (arguments.read("--persp")) settings->setShadowMapProjecti
> onHint(osgShadow::ShadowSettings::PERSPECTIVE_SHADOW_MAP);
> if (arguments.read("--ortho")) settings->setShadowMapProjecti
> onHint(osgShadow::ShadowSettings::ORTHOGRAPHIC_SHADOW_MAP);
>
> unsigned int unit = 1;
> if (arguments.read("--unit", unit)) settings->setBaseShadowTexture
> Unit(unit);
>
> double n = 0.0;
> if (arguments.read("-n", n)) settings->setMinimumShadowMapNearFarRatio(n);
>
> unsigned int numShadowMaps;
> if (arguments.read("--num-sm", numShadowMaps))
> 

[osg-users] Fwd: Strange osgShadow appearance of multiple models self-shadowing under a point light

2017-06-27 Thread Bris Li
Hi all,

It's a problem with osgShadow.
I hava a scene with multiple pagedLOD models bundled in a group. The models
are tiles of a city, and each tile is a single model (buildings are not
separeted with terrain).
I uses the code in the osgShadow example for shadowing, and put a point
light in _shadowedScene. The models shadow on themselves.

As the attached image shows, the shadow result is partially correct. In
some particular angle range from the light source, the correct shadow is
casted. But in the other range, shadow is not cast correctly, but some
strange shadows appear which I guess is casted from the model at the other
side.
Also, if I put the light on one side of the building, the other side of it
is still lit, no shadow showing.
I have tried different shadow implementations, but the results remain
almost the same.

I can't figure out what is happening since the shadow is just 'partially'
abnormal. Stuck here for days.

Thanks.

Regards,
tqjxlm.

osg version 3.4.0.
code:


-
*Shadow*
 // arguments
 char* argv[] = {
"--vdsm",
"--positionalLight",
"--ortho",
"--parallel-split",
"--num-sm",
"4",
"--cascaded"
};

int argc = sizeof(argv) / sizeof(argv[0]);

// use an ArgumentParser object to manage the program arguments
osg::ArgumentParser arguments(, argv);

// get the viewer
osgViewer::View& viewer = getViewer();

// init shadowed scene
_shadowedScene = new osgShadow::ShadowedScene;
osgShadow::ShadowSettings* settings = _shadowedScene->getShadowSettings();
settings->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
settings->setCastsShadowTraversalMask(CastsShadowTraversalMask);

double distance;
if (arguments.read("--max-shadow-distance", distance))
{
settings->setMaximumShadowMapDistance(distance);
}

// choose shadow map implementation
osg::ref_ptr msm = NULL;
if (arguments.read("--no-shadows"))
{
OSG_NOTICE << "Not using a ShadowTechnique" << std::endl;
_shadowedScene->setShadowTechnique(0);
}
else if (arguments.read("--stsm"))
{
osg::ref_ptr st = new
osgShadow::StandardShadowMap;
_shadowedScene->setShadowTechnique(st.get());
}
else if (arguments.read("--pssm"))
{
int mapcount = 3;
while (arguments.read("--mapcount", mapcount));
osg::ref_ptr pssm = new
osgShadow::ParallelSplitShadowMap(NULL, mapcount);

int mapres = 1024;
while (arguments.read("--mapres", mapres))
pssm->setTextureResolution(mapres);

while (arguments.read("--debug-color")) { pssm->setDebugColorOn(); }


int minNearSplit = 0;
while (arguments.read("--minNearSplit", minNearSplit))
if (minNearSplit > 0) {
pssm->setMinNearDistanceForSplits(minNearSplit);
}

int maxfardist = 0;
while (arguments.read("--maxFarDist", maxfardist))
if (maxfardist > 0) {
pssm->setMaxFarDistance(maxfardist);
std::cout << "ParallelSplitShadowMap : setMaxFarDistance(" << maxfardist <<
")" << std::endl;
}

int moveVCamFactor = 0;
while (arguments.read("--moveVCamFactor", moveVCamFactor))
if (maxfardist > 0) {
pssm->setMoveVCamBehindRCamFactor(moveVCamFactor);
}

double polyoffsetfactor = pssm->getPolygonOffset().x();
double polyoffsetunit = pssm->getPolygonOffset().y();
while (arguments.read("--PolyOffset-Factor", polyoffsetfactor));
while (arguments.read("--PolyOffset-Unit", polyoffsetunit));
pssm->setPolygonOffset(osg::Vec2(polyoffsetfactor, polyoffsetunit));

_shadowedScene->setShadowTechnique(pssm.get());
}
else if (arguments.read("--ssm"))
{
osg::ref_ptr sm = new osgShadow::SoftShadowMap;
_shadowedScene->setShadowTechnique(sm.get());
}
else if (arguments.read("--vdsm"))
{
while (arguments.read("--debugHUD")) settings->setDebugDraw(true);
if (arguments.read("--persp")) settings->setShadowMapProjecti
onHint(osgShadow::ShadowSettings::PERSPECTIVE_SHADOW_MAP);
if (arguments.read("--ortho")) settings->setShadowMapProjecti
onHint(osgShadow::ShadowSettings::ORTHOGRAPHIC_SHADOW_MAP);

unsigned int unit = 1;
if (arguments.read("--unit", unit)) settings->setBaseShadowTexture
Unit(unit);

double n = 0.0;
if (arguments.read("-n", n)) settings->setMinimumShadowMapNearFarRatio(n);

unsigned int numShadowMaps;
if (arguments.read("--num-sm", numShadowMaps))
settings->setNumShadowMapsPerLight(numShadowMaps);

if (arguments.read("--parallel-split") || arguments.read("--ps"))
settings->setMultipleShadowMapHint(osgShadow::ShadowSettings::PARALLEL_
SPLIT);
if (arguments.read("--cascaded")) settings->setMultipleShadowMap
Hint(osgShadow::ShadowSettings::CASCADED);


int mapres = 1024;
while (arguments.read("--mapres", mapres))
settings->setTextureSize(osg::Vec2s(mapres, mapres));

osg::ref_ptr vdsm = new
osgShadow::ViewDependentShadowMap;
_shadowedScene->setShadowTechnique(vdsm.get());
}
else if (arguments.read("--lispsm"))
{
if (arguments.read("--ViewBounds"))
msm = new osgShadow::LightSpacePerspectiveShadowMapVB;
else if (arguments.read("--CullBounds"))
msm = new