奇怪的阴影贴图行为,我能正确计算我的坐标吗?

时间:2013-08-01 15:26:20

标签: opengl glsl shadow shadow-mapping

我为我的图形引擎编写了一个阴影贴图着色器。我按照这些教程: Part 1以及以下部分。

不幸的是,我得到的结果相当多。这里有一些screenshots。它们显示了我的场景通常的样子,启用阴影的场景和阴影贴图的内容(请忽略中心的白色东西,这就是鸭子的几何形状)。

这是我在片段着色器中计算阴影贴图的坐标的方法:

float calcShadowFactor(vec4 lightSpacePosition) {
    vec3 projCoords = lightSpacePosition.xyz / lightSpacePosition.w;
    vec2 uvCoords;
    uvCoords.x = 0.5 * projCoords.x + 0.5;
    uvCoords.y = 0.5 * projCoords.y + 0.5;
    float z = 0.5 * projCoords.z + 0.5;
    float depth = texture2D(shadowMapSampler, uvCoords).x;
    if (depth < (z + 0.00001f))
        return 0.0f;
    else
        return 1.0f;
}

lightSpacePosition向量由:

计算
projectionMatrix * inverseLightTransformationMatrix
    * modelTransformationMatrix * vertexPosition

投影矩阵是:

[1.0f / (tan(fieldOfView / 2) * (width / height)), 0.0f, 0.0f, 0.0f]
[0.0f, 1.0f / (tan(fieldOfView / 2), 0.0f, 0.0f]
[0.0f, 0.0f, (-zNear - zFar) / (zNear - zFar), 2.0f * zFar * zNear / (zNear - zFar)]
[0.0f, 0.0f, 1.0f, 0.0f]

我的阴影贴图似乎没问题,我确保渲染过程使用与我的阴影贴图相同的lightSpacePosition矢量。但我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:0)

虽然我完全不了解这一点,但我认为我发现了这个错误: 我需要将坐标转换为NDC空间,然后将矩阵相乘。我的阴影坐标计算现在看起来像这样:

mat4 biasMatrix = mat4(
    0.5f, 0.0f, 0.0f, 0.0f,
    0.0f, 0.5f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.5f, 0.0f,
    0.5f, 0.5f, 0.5f, 1.0f
);
vec4 shadowCoord0 = biasMatrix * light * vec4(vertexPosition, 1.0f);
shadowCoord = shadowCoord0.xyz / shadowCoord0.w;

,其中

light = projectionMatrix * inverseLightTransformationMatrix
* modelTransformationMatrix

现在片段着色器的阴影因子计算相当简单:

float shadowFactor = 1.0f;
if (texture(shadowMapSampler, shadowCoord.xy).z < shadowCoord.z - 0.0001f)
    shadowFactor = 0.0f;