0

シャドウ マップ

シャドウ マップを使用してシャドウを作成しようとしています。シャドウ マップは適切にレンダリングされていると思います。

球体の影が正しい位置にないようですが、どうすれば修正できますか? また、球の周りに黒いリングがあるのはなぜですか? また、それを取り除く方法は?

シャドウ マップの頂点シェーダーで

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);


}
4

0 に答える 0