This line:
vec2 displacementNDC = currentPosClip.xy/currentPosClip.w -
previousPosClip.xy/previousPosClip.w;
should be
displacementNDC = currentPosClip.xy/currentPosClip.w -
previousPosClip.xy/previousPosClip.w;

Otherwise you will be declaring a new variable with the name displacementNDC
the main function as scope.

/Andreas

2008/11/3 Engvall Åsa <[EMAIL PROTECTED]>

>  Hi osg-users!
>
> I'm trying to write my first shader, it is a very simple test program which
> sets the color on a sphere.
> The color depends on whether the sphere has moved relative to its position
> in the previous frame.
>
> I use two varying variables, which are set in the vertex shader, see the
> code below. If the sphere has moved, the variable called displacementNDC is
> /= 0.
>
> Then I expect that it should still be /= 0 in the fragment shader, but by
> some reason the value is == 0.
> The other varying variable, "green", does not change when going from vertex
> shader to fragment shader.
> (Just for test, I also tried to put the variable called currentPosClip in a
> varying variable. Testing for currentPosClip == 0 in the vertex shader
> returned false, but it returned true in the fragment shader.)
>
> Please, can anybody explain what is happening? Why are the values changing
> to zero?
>
> Regards,
> Asa
>
> -----------Vertex shader ------------------
> uniform mat4 prevModelViewProjectionMatrix;
> varying vec2 displacementNDC;
> varying vec4 green;
>
> void main()
> {
>     // Calculate the previous and current position in clip space.
>     vec4 currentPosClip = gl_ModelViewProjectionMatrix*gl_Vertex;       //
> Transforms vertex position
>     vec4 previousPosClip = prevModelViewProjectionMatrix*gl_Vertex;     //
> from object space to clip space.
>
>     gl_Position = ftransform();
>
>     // Calculate displacement in NDC space.
>     vec2 displacementNDC = currentPosClip.xy/currentPosClip.w -
> previousPosClip.xy/previousPosClip.w;
>
>     // If the displacement is zero, varying variable "green" is set to the
> RGBA value for green.
>     if (displacementNDC == vec2(0,0))                                   //
> Object has not moved.
>         green = vec4(0, 1, 0, 0);
>     else
>         // Object has moved.
>         green = vec4(0.0);
> }
> -----------End vertex shader ------------------
>
> -----------Fragment shader ------------------
> varying vec2 displacementNDC;
> varying vec4 green;
>
> void main()
> {
>     if (displacementNDC == vec2(0,0))
>         gl_FragColor = vec4(1,0,0,1) + green;
>     else
>         gl_FragColor = vec4(0,0,1,1) + green;
> }
> -----------End fragment shader ------------------
>
> When the sphere has moved, the resulting color should be blue. But it
> becomes red.
>
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to