私は遅延描画パイプラインにシャドーマッピングを実装しようとしていますが、実際にシャドーマップを生成してから、シャドーイングしますそうではありません。シャドーマップの結果が正しくない
私は私のエンジンの中で「太陽」という単一の指向性の光を持っています。私はライティングのためのレンダリング設定を延期しましたが、それはこれまで正しく動作しています。
glm::vec3 position = r->getCamera()->getCameraPosition(); // position of level camera
glm::vec3 lightDir = this->sun->getDirection(); // sun direction vector
glm::mat4 depthProjectionMatrix = glm::ortho<float>(-10,10,-10,10,-10,20); // ortho projection
glm::mat4 depthViewMatrix = glm::lookAt(position + (lightDir * 20.f/2.f), -lightDir, glm::vec3(0,1,0));
glm::mat4 lightSpaceMatrix = depthProjectionMatrix * depthViewMatrix;
そして、私の照明シェイダーに、私は、次のコードを使用する画素か否かを決定するために:私は、ビュー行列を生成するために、次のコードを使用して、シャドウマップの深さだけFBOに再びシーンをレンダリング影にまたはではありません。
// lightSpaceMatrix is the same as above, FragWorldPos is world position of the texekl
vec4 FragPosLightSpace = lightSpaceMatrix * vec4(FragWorldPos, 1.0f);
// multiply non-ambient light values by ShadowCalculation(FragPosLightSpace)
// ... do more stuff ...
float ShadowCalculation(vec4 fragPosLightSpace) {
// perform perspective divide
vec3 projCoords = fragPosLightSpace.xyz/fragPosLightSpace.w;
// vec3 projCoords = fragPosLightSpace.xyz;
// Transform to [0,1] range
projCoords = projCoords * 0.5 + 0.5;
// Get closest depth value from light's perspective (using [0,1] range fragPosLight as coords)
float closestDepth = texture(gSunShadowMap, projCoords.xy).r;
// Get depth of current fragment from light's perspective
float currentDepth = projCoords.z;
// Check whether current frag pos is in shadow
float bias = 0.005;
float shadow = (currentDepth - bias) > closestDepth ? 1.0 : 0.0;
// Ensure that Z value is no larger than 1
if(projCoords.z > 1.0) {
shadow = 0.0;
}
return shadow;
}
しかし、本当に私が後だものを私を取得しないこと。指向性光があるので
をレンダリング:ここ半assedly Photoshopで画像に変換シャドーイング後の出力のスクリーンショットだけでなく、シャドウマップです私のシェイダーの唯一のライトですが、シャドウマップは、パースペクティブ/方向がおおよそ一致しているので、シャドーマップが正しく表示されているようです。しかし、私が理解していないのは、ティーポットのどれもが実際に他のティーポットに影をつけてしまうのではないということです。
私が間違っている可能性のある点については、何か指摘していただきたいと思います。私は自分の問題は、その明るい空間行列の計算にあると思う(私はそれを適切に計算する方法は不明だが、動いているカメラがあれば、見えるものは更新される)遅延レンダラがシェーディングしているテクセルが影になっているかどうかは関係ありません。 (FWIW、深度バッファから世界の位置を決定しますが、この計算が正しく機能していることを証明しました)
ありがとうございました。
シャドウマップに使用する深度テクスチャを割り当てたときに、OpenGLに間違った値を渡していたことが判明しました。これは、シェーダが読み込み中にテクスチャを誤って解釈する原因となりました。不思議ですが、今はうまくいきます。 –