阴影未正确渲染

时间:2015-06-18 19:47:31

标签: glsl opengl-3 opengl-4 shadow-mapping

shadow map http://i59.tinypic.com/16k5bv4.png

我正在尝试使用阴影贴图创建阴影。我相信阴影贴图很好。

看起来球体的阴影不在正确的位置,所以我该如何解决呢?另外,为什么球体周围会出现黑环并如何消除它呢?

在阴影贴图顶点着色器

gl_Position = u_depthMatrix * worldCoord;

在阴影贴图片段着色器

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 个答案:

没有答案