Ben,

I promised to answer some of your questions today. Some time ago I was
studying SoftShadowMap code and I had the feeling that I understood it. But
today when I tried to look at this again to find the answers for your
questions about jitter scale and softness width I realized I am not so sure
anymore. So its better if I will not try to spread confusion with some
intuitions that may be incorrect. But I am ready to answer the question
regarding AmbientBias.


I guess that AmbientBias was introduced in early osgdepthshadowmap example
(osg 1.2 ?) to achieve the similar result as fixed pipeline
TEXTURE_COMPARE_FAIL_VALUE_ARB parameter. See
http://oss.sgi.com/projects/ogl-sample/registry/ARB/shadow_ambient.txt

If you look at shadow fragment shader, fragment coloring formula looks like
this:

        vec4 color = gl_Color * texture2D( osgShadow_baseTexture,
gl_TexCoord[0].xy );
        vec4 shadow = shadow2DProj( osgShadow_shadowTexture, gl_TexCoord[1] );
        gl_FragColor = color * ( osgShadow_ambientBias.x + 
osgShadow_ambientBias.y
* shadow );


AmbientBias variable is used in shadow & soft shadow mapping techiques. Its
usually used to set up lower bound for shadowing factor. By default
shadow2DProj returns value from range [0..1]. If such shadow factor was used
directly, shadowed areas would be completely black. Sometimes we want to
make them to be only a bit darker than lit areas. So essentially AmbientBias
is used to define how much shadows darken the scene.

By setting AmbientBias.x to some value from range 0..1 one limits minimal
shadow value (hence AmbientBias because shadowed areas are lit only by
ambient component). AmbientBias.y is usually set up to 1 - AmbientBias.x but
I expect that it may be also set bit larger or smaller values used to make
shadow range more dynamic or flat.



Having said that, I should mention that I personally don't use AmbientBias
and above shadowing formula. I often substitute default shaders with shaders
using formula which is presented in many ShadowMapping papers. ie:

        uniform dimming; // similar to AmbientBias defines minimal Diffuse 
amount
not darkened by shadow

        vec4 texColor = texture2D( osgShadow_baseTexture, gl_TexCoord[0].xy );
        float shade = shadow2DProj( osgShadow_shadowTexture, gl_TexCoord[1] ).x;
        float diffuseShade = dimming + ( 1.0 - dimming ) * shade;

        gl_FragColor =  ( ambient + diffuseShade * diffuse) * texColor + 
specular *
shade;

But such formula requires usage of vertex shader to pass diffuse and ambient
components separately. Fixed pipeline provides only gl_Color containing
diffuse and ambient terms added together.

Cheers,
Wojtek Lewandowski

_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to