Shadow not rendered correctly

118 views Asked by At

shadow map

I am trying create shadow using shadow maps. I believe that shadow map is rendered well.

It seems that sphere's shadow is not in the correct place, so how would I go about fixing that? Also why is there a black ring around the sphere and how to eliminate it?

In the shadow map vertex shader

gl_Position = u_depthMatrix * worldCoord;

In the shadow map fragment shader

fragmentdepth =  gl_FragCoord.z;

vs.glsl

uniform mat4 u_Model;
uniform mat4 u_View;
uniform mat4 u_Persp;
uniform mat4 u_InvTrans;
uniform vec3 u_LightColor;
uniform vec3 u_LightDirection;
uniform vec3 u_EyePos;
uniform mat4 u_depthBiasMatrix;

in vec3 Position;
in vec3 Normal;
in vec2 Texcoord;


out vec3 v_Normal;
out vec2 v_Texcoord;
out vec3 v_Position;
out vec3 v_PositionMC;

out vec4 shadowCoord;

void main(void)
{
    v_Normal = (u_InvTrans*vec4(Normal,0.0)).xyz;
    vec4 world = u_Model * vec4(Position, 1.0);
    vec4 cameraCoord = u_View * world;
    v_Position = cameraCoord.xyz;
    shadowCoord = u_depthBiasMatrix * world;
    gl_Position = u_Persp * cameraCoord;
}

fs.glsl

    uniform sampler2D shadowMap;
uniform vec3 u_LightColor;
uniform vec3 u_LightDirection;
uniform vec3 u_EyePos;
uniform vec3 u_Ka;
uniform vec3 u_Kd;
uniform vec3 u_Ks;  
in vec3 v_Normal;   
in vec2 v_Texcoord;
in vec3 v_Position;            //coordinate of vertex in camera coordinate system

in vec4 shadowCoord;

void main(void)
{
    vec3 v_Normal1 = normalize(v_Normal);
    //Diffuse Lighting
    vec3 diff = normalize(u_LightDirection - v_Position);
    float diffuse = max(dot(diff , v_Normal1) , 0);
    vec3 diffuseColor = diffuse * u_Kd * u_LightColor;

    //Specular Lighting
    vec3 v = normalize(vec3(u_EyePos - v_Position));
    vec3 h = normalize(diff + v);
    float sl = pow(max(dot(h, v_Normal1) , 0.0),  50);
    if ( diffuse <= 0 ) sl = 0; 
    vec3 specularColor = sl * u_Ks * u_LightColor;

    vec3 v_Color;
    v_Color =  u_Ka + diffuseColor + specularColor ;

    //Shadow Part
    vec3 shadowCoord3;
    float shadowFactor = 1.0;
    if(shadowCoord.w > 0 )
    {
        shadowCoord3 = shadowCoord.xyz / shadowCoord.w ;

        if ( texture2D( shadowMap, shadowCoord3.xy ).z  <  shadowCoord3.z)
        {
            shadowFactor = 0.2;
        }
    }
    gl_FragColor = shadowFactor * vec4(v_Color , 1);


}
0

There are 0 answers