[osg-users] Fragment Shader Question

Terry Welsh mogumbo at gmail.com
Mon Nov 5 08:35:16 PST 2007


If you are seeing transparent objects, then you are probably getting a
value smaller than 1.0 in the alpha component of gl_FragColor.  It
looks like you could be getting alpha from gl_Color,
gl_FrontLightProduct[0].ambient, or from your texture.  Try to figure
out where the problem is by sending those sources to gl_FragColor
individually and view your scene using each one.

Also, you should be able to get this working without 'if' statements,
which will slow down your shader.  Ambient light is usually added, not
multiplied.  Try something like this:   color = ((direct light *
shadow) + ambient light) * surface color.
- Terry

> Message: 7
> Date: Sun, 04 Nov 2007 16:48:02 +0100
> From: Andreas Goebel <a-goebel at gmx.de>
> Subject: [osg-users] Fragment Shader Question
> To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
> Message-ID: <472DE9B2.50700 at gmx.de>
> Content-Type: text/plain; charset=ISO-8859-15; format=flowed
>
> Hi,
>
> I have played around a bit with the FragmentShader for ShadowMap.cpp
>
> Instead of using a predefined bias I wanted the shadow to appear exactly
> in the currents materials ambient color.
>
> That's what I did:
>
> static const char fragmentShaderSource_withBaseTexture[] =
>         "uniform sampler2D osgShadow_baseTexture; \n"
>         "uniform sampler2DShadow osgShadow_shadowTexture; \n"
>         "uniform vec2 osgShadow_ambientBias; \n"
>         "\n"
>         "void main(void) \n"
>         "{ \n"
>         "    if (!shadow2DProj(osgShadow_shadowTexture,
> gl_TexCoord[1])[0] ) { \n"
>         "        gl_FragColor = gl_FrontLightProduct[0].ambient *
> texture2D( osgShadow_baseTexture, gl_TexCoord[0].xy ); \n"
>         "   } else { \n"
>         "        gl_FragColor = gl_Color * texture2D(
> osgShadow_baseTexture, gl_TexCoord[0].xy ); \n"
>         "    } \n"
>         "}\n";
>
> This works, and the result is quite good when looking at the object from
> the same direction as the light-source.
>
> If I look at it from the other side then at the places where the shadow
> is (which is invisible here, as it uses the ambient color) the object is
> slightly transparent.
>
> Any clues on this?
>
> Regards,
>
> Andreas
>


More information about the osg-users mailing list