1

我为我的图形引擎编写了一个阴影贴图着色器。我遵循了这些教程: 第 1 部分和以下部分。

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

这就是我在片段着色器中计算坐标以对阴影贴图进行采样的方式:

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 向量。但我不知道出了什么问题。

4

1 回答 1

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;
于 2013-08-03T13:55:11.840 回答