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