グラフィック エンジン用のシャドウ マップ シェーダーを作成しました。私は次のチュートリアルに従いました: パート 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 ベクトルを使用していることを確認しました。しかし、何が悪いのかわかりません。