シャドウマッピングアーティファクト


8

私は深度テクスチャを使用してOpenGLのシャドウマッピングをいじっています。深度テクスチャは細かいので、シーンにマッピングできますが、オブジェクトの裏側に奇妙なアーティファクトがあります。

後方にアーティファクトがあり、影を落としている球

私の質問は、これを引き起こしているものであり、どうすれば修正できますか?

私が使用しているフラグメントシェーダーはかなり単純です(ここに青がない理由に疑問がある場合に備えて、簡単にするために色を取り除いています)。

in vec4 vShadowCoord;

uniform sampler2DShadow shadowMap;

out vec4 fragColor;

void main()
{
    float bias = 0.005;
    float visibility = 1.0;
    if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
        visibility = 0.25;

    fragColor = vec4(visibility);
}

編集:必要に応じて、上記のコードのみを使用する最低限の作業例のスクリーンショット(色なし)。

同じ球体、マイナス色


1
表示されたコード(青を削除したもの)もアーティファクトの原因となっているかどうかを確認できますか?コードを絞り込んだ場合は、絞り込んだコードの画像を表示することで、無関係な詳細を除外し、問題を強調できます。
trichoplax

はい、そうです、そこに色が付いたスクリーンショットを撮ると思いました。それ以外の場合はさらに醜く見えます:)
Blarglenarf

それは理解できますが、助けを求めているのは醜いので、コードと一致するスクリーンショットを含めると、誰かが問題を目にする可能性が高くなります。
trichoplax

1
けっこうだ。追加のスクリーンショットを追加しました。
Blarglenarf、2015

バイアスをかけて少し遊んでみましたか?
cifz

回答:


11

この問題は、標準のシャドウマップニキビアーティファクトのように見えます。さらに、あなたの照明方程式は不完全であるか間違っています。光は、法線が反対側を向いている面に影響を与えるべきではありません。これはまた、適切な方程式では、球の「暗い」側にニキビアーティファクトが発生しないことを意味します。

にきびのアーティファクトには3つの原因があります。

  • 最初のニキビの原因はシャドウマップの精度です。シャドウキャスティングライトのニアプレーンとファープレーンができるだけタイトになるようにしてください。正確な深度は重要ではないため、ニアプレーンの前のすべてのオブジェクトをパンケーキ化できます。
  • 2番目のニキビソースはシャドウマップの解像度です。ディレクショナルライトの場合、シャドウ距離を100〜200mにするには、少なくとも3つの1024x1012カスケードでカスケードシャドウマップを実行する必要があります。均一な投影の1つのシャドウマップで同様のシャドウ距離をカバーすることは困難です。
  • 3番目のニキビソースは、PCFのようなワイドシャドウマップフィルターです。ワイドカーネル全体で単一の深度深度比較値を使用するだけでは不十分です。これを修正する方法はたくさんありますが、堅牢な方法はありません。

要約すると、カスケードがいくつかあり、バイアスを微調整したタイトフラスタムで、一般的なケースが機能します(指向性ライト)。基本的なシャドウマップが十分に堅牢な場合にのみ、シャドウフィルタリングを無効にして調整を開始し、フィルタリングを調整します。

さらに、現在使用している一定の深度バイアスとは別に、勾配深度バイアスと最大勾配深度バイアスも追加する必要があります。どちらも、レンダーステートとして、またはシャドウマップレンダリング中のシェーダーコードとして実装できます。スロープ深度バイアスは、単にdot(normal、lightDir)でスケーリングされた魔法のバイアス値です。

追加の興味深いメソッドがいくつかあり、それらのほとんどは優れたデモで実装されています。MattPettineo-「サンプリングシャドウテクニック」

  • シャドウマップレンダリング中にカリングを反転します(ピーターパンニングのニキビのトレード)。
  • ノーマルオフセットシャドウマッピングはバイアスの問題には不思議ですが、シェーディング中に頂点法線が必要です。
  • 分散ベースの方法(ESM、VSM、EVSM)はバイアスの問題を完全に取り除きますが、その他の欠点(光漏れやパフォーマンスの問題)があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.