[osg-users] Fragment Shader Question
Andreas Goebel
a-goebel at gmx.de
Mon Nov 5 09:00:10 PST 2007
Terry Welsh schrieb:
> 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
>
Hi Terry,
I think that the problem was that I cannot use gl_FrontLightProduct on
the backside! Unfortunately I did not have the possibility to decide
which side I am on on the fragment stage (because I use
twoSided-lighting gl_BACK won´t do), so I decided to use a more complex
approach with a vertex shader and a fragment shader. This gave me total
control over the colors, and now it works (though it was quite hard to
code for a shader-beginner like me!).
What I want is to use exactly the ambient light for the shadow, and I
would not know how to do this without an if-statement!
Thanks,
Andreas
>
>> 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
>>
>>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
More information about the osg-users
mailing list