2

我正在我的引擎中开始全向阴影映射。现在我只制作一个阴影贴图作为测试。使用我当前的着色器时,我得到了一个奇怪的结果。这是显示问题的屏幕截图:

故障阴影映射示例

我在阴影贴图渲染的投影矩阵中使用了 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);
}

我该如何解决这个问题(除了增加我的远平面距离)?

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

4

0 回答 0