2017-03-08 18 views
-1

私は遅延描画パイプラインにシャドーマッピングを実装しようとしていますが、実際にシャドーマップを生成してから、シャドーイングしますそうではありません。シャドーマップの結果が正しくない

私は私のエンジンの中で「太陽」という単一の指向性の光を持っています。私はライティングのためのレンダリング設定を延期しましたが、それはこれまで正しく動作しています。

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; 
} 

しかし、本当に私が後だものを私を取得しないこと。指向性光があるので

Render Output 出力

Shadow Map シャドウ地図

をレンダリング:ここ半assedly Photoshopで画像に変換シャドーイング後の出力のスクリーンショットだけでなく、シャドウマップです私のシェイダーの唯一のライトですが、シャドウマップは、パースペクティブ/方向がおおよそ一致しているので、シャドーマップが正しく表示されているようです。しかし、私が理解していないのは、ティーポットのどれもが実際に他のティーポットに影をつけてしまうのではないということです。

私が間違っている可能性のある点については、何か指摘していただきたいと思います。私は自分の問題は、その明るい空間行列の計算にあると思う(私はそれを適切に計算する方法は不明だが、動いているカメラがあれば、見えるものは更新される)遅延レンダラがシェーディングしているテクセルが影になっているかどうかは関係ありません。 (FWIW、深度バッファから世界の位置を決定しますが、この計算が正しく機能していることを証明しました)

ありがとうございました。

答えて

1

シャドウの問題をデバッグするのは難しい場合があります。

  1. レンダリングを注意深く見ると、実際には左上隅の1つのポットに影が表示されます。

  2. 太陽を回転させてみてください。これは、通常、光変換マトリックスに問題があるかどうかを確認するのに役立ちます。あなたの出力から、太陽は非常に水平で、この設定で影を投げていないようです。

  3. 行列を正しく計算しているように見えますが、glm :: ortho(-10,10、-10,10、-10,20の最大深度を縮めてみてください)あなたのシーンにしっかりとフィットします。深度が大きすぎると精度が失われ、影にはアーチファクトが発生します。問題はさらにどこから来ている、ここからあなたのシャドウマップの検索から結果をoutputingてみ視覚化する

  4. :シャドウマップが正しく投影されている場合は

closestDepth = texture(gSunShadowMap, projCoords.xy).r 

、あなたは深さの比較に問題があることを知っています。お役に立てれば!

+0

シャドウマップに使用する深度テクスチャを割り当てたときに、OpenGLに間違った値を渡していたことが判明しました。これは、シェーダが読み込み中にテクスチャを誤って解釈する原因となりました。不思議ですが、今はうまくいきます。 –

関連する問題