Cascading shadow mapping search solution / gl_FragCoord.z

I implemented cascading shadow mapping, as in the nvidia SDK (http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip). However, my search just doesn't work.

Here is an image depicting my current state: http://i.imgur.com/SCHDO.png

The problem is that I ended up in the first split right away, although I am far from it. As you can see, other cleavages are not even considered.

I thought that the reason for this could be a different projection matrix, which the main engine uses. It differs from the one I supply to the algorithm, but I also tried to pass the same matrix to the shader and calculate it this way: gl_Position = matProj * gl_ModelViewMatrix * gl_Vertex Nevertheless, this does not change anything. I still had only one split.

Here are my shaders:

[vertex]

varying vec3 vecLight;
varying vec3 vecEye;
varying vec3 vecNormal;
varying vec4 vecPos;
varying vec4 fragCoord;
void main(void)
{
    vecPos = gl_Vertex;
    vecNormal = normalize(gl_NormalMatrix * gl_Normal);
    vecLight = normalize(gl_LightSource[0].position.xyz);
    vecEye = normalize(-vecPos.xyz);

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

[fragment] (only the shadow part)

vec4 getShadow()
{
    vec4 sm_coord_c = texmat_3*vecPos;
    float shadow = texture2D(smap_3, sm_coord_c.xy).x;
    float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0;

    vec4 shadow_c = vec4(1.0, 1.0, 1.0, 1.0) * s;

    if(gl_FragCoord.z < vecFarbound.x)
    {
      vec4 sm_coord_c = texmat_0*vecPos;
      float shadow = texture2D(smap_0, sm_coord_c.xy).x;
      float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0;

      shadow_c = vec4(0.7, 0.7, 1.0, 1.0) * s;
    }
    else if(gl_FragCoord.z < vecFarbound.y)
    {
      vec4 sm_coord_c = texmat_1*vecPos;
      float shadow = texture2D(smap_1, sm_coord_c.xy).x;
      float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0;

      shadow_c = vec4(0.7, 1.0, 0.7, 1.0) * s;
    }
    else if(gl_FragCoord.z < vecFarbound.z)
    {
      vec4 sm_coord_c = texmat_2*vecPos;
      float shadow = texture2D(smap_2, sm_coord_c.xy).x;
      float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0;

      shadow_c = vec4(1.0, 0.7, 0.7, 1.0) * s;
    }

    return shadow_c;
}

So, for some reason, gl_FragCoord.z ​​is smaller than vecFarbound.x, regardless of where I am on stage. (Also pay attention to the shaded area in the far left corner, this increases the higher, as I move the camera and soon intercept the entire scene.)

I checked the vecFarbound values ​​and they are similar to the ones indicated in the nvidia code, so I assume that I calculated them correctly.

gl_FragCoord.z?

+3
1

csm

float tempDist = 0.0;
tempDist = dot(EyePos.xyz, EyePos.xyz);
if (tempDist < split.x) ...
else if (tempDist < split.y) ...
...

Thsi , . Z ( ), , - z.

split- viewSpace, ( ) gl_FragCoord.z ​​..

+1

All Articles