阴影贴图总是会产生超出远处平面的阴影

时间:2013-11-10 20:22:36

标签: opengl glsl shadow-mapping

我正在开发我的引擎中的全向阴影贴图。现在我只生成一个shadowmap作为测试。使用我当前的着色器时,我得到一个奇怪的结果。以下是显示问题的屏幕截图:

Example of glitchy shadowmapping

我在阴影贴图渲染的投影矩阵中使用近似值0.5和远值5.0。就像我所知道的那样,光线空间z大于我的远平面距离的任何值都是由我的片段着色器在阴影中计算的。

这是我的片段着色器:

in vec2 st;

uniform sampler2D colorTexture;
uniform sampler2D normalTexture;
uniform sampler2D depthTexture;
uniform sampler2D shadowmapTexture;

uniform mat4 invProj;
uniform mat4 lightProj;

uniform vec3 lightPosition;

out vec3 color;

void main () {
    vec3 clipSpaceCoords;
    clipSpaceCoords.xy = st.xy * 2.0 - 1.0;
    clipSpaceCoords.z = texture(depthTexture, st).x * 2.0 - 1.0;
    vec4 position = invProj * vec4(clipSpaceCoords,1.0);
    position.xyz /= position.w;

    vec4 lightSpace = lightProj * vec4(position.xyz,1.0);
    lightSpace.xyz /= lightSpace.w;
    lightSpace.xyz = lightSpace.xyz * 0.5 + 0.5;
    float lightDepth = texture(shadowmapTexture, lightSpace.xy).x;

    vec3 normal = texture(normalTexture, st);

    vec3 diffuse;
    float shadowFactor = 1.0;
    if(lightSpace.w > 0.0 && lightSpace.z > lightDepth+0.0042) {
        shadowFactor = 0.2;
    }
    else {
        float k = 0.00001;
        vec3 distanceToLight = lightPosition - position.xyz;
        float distanceLength = length(distanceToLight);
        float attenuation = (1.0 / (1.0 + (0.1 * distanceLength) + k * (distanceLength * distanceLength)));
        float diffuseTemp = max(dot(normalize(normal), normalize(distanceToLight)), 0.0);
        diffuse = vec3(1.0, 1.0, 1.0) * attenuation * diffuseTemp;
    }
    vec3 gamma = vec3(1.0/2.2);
    color = pow(texture(colorTexture, st).xyz*shadowFactor+diffuse, gamma);
}

如何解决此问题(除了增加远距离飞机距离外)?

另一个问题,因为这是我第一次尝试使用阴影贴图:我是否正确地进行了与阴影相关的照明?

0 个答案:

没有答案