基本的なシャドウ マッピング手法に関する簡単な OpenGL テスト アプリケーションを作成しました。
オクルーダーの背面にあるものを除いて、ほとんどのアーティファクトを削除しました。最初のレンダリング パス (シャドウ深度マップの塗りつぶし) で前面のカリングを有効にしているため、この背面にはアーティファクトが関係しています。その結果、セルフ シャドウイングの Z ファイティング アーティファクトがあります。
この種の問題を解決するには、いくつかのチュートリアルで、ライト空間の頂点位置の深さを 0.0005f のような非常に小さなオフセットでバイアスする必要があると述べています。
これが私の問題のスクリーンショットです(見やすくするために、ボックスの周囲光の値を増やしました)。ここでは深度オフセットなし:
ご覧のとおり、強い自己シャドーイングがあります。
フラグメント シェーダーで使用するコードの一部を次に示します。
if (ShadowCoords.w > 0.0f)
{
vec4 tmp_shadow_coords = ShadowCoords;
tmp_shadow_coords.z -= 0.0000f; //DEPTH OFFSET DISABLE HERE
shadowFactor = textureProj(ShadowMap, tmp_shadow_coords);
}
0.0002f に等しいオフセットを使用するとどうなるか見てみましょう。
tmp_shadow_coords.z -= 0.0002f;
スクリーンショット:
ご覧のとおり、セルフ シャドウイングが減少しています。0.0003f に等しいオフセットで試してみましょう:
tmp_shadow_coords.z -= 0.0003f;
スクリーンショット:
ご覧のとおり、自己の影が消えました! しかし、オクルーダーと影の間の境界に向かってズームすると、影のない領域が見えます。このアーティファクトは、ピーター パニング アーティファクトと呼ばれます。
したがって、これは奇妙な状況です。セルフ シャドウ アーティファクトを回避するには、ライト スペースで頂点の深度値を変更する必要があります。しかし、深度値トレインのこの変更により、ピーター パニング アーティファクトが発生します。
オフセット値を大きくすると、問題はさらに悪化します。
アップデート
オフセットも入れてみました。例えば:
tmp_shadow_coords.z += 0.0002f;
スクリーンショット:
セルフ シャドウイングは少なくなりますが、ピーター パニング アーティファクトはありません。残念ながら、立方体の前面にいくつかのアーティファクトが表示されます。前面に影があふれています。
オフセットを増やすと:
tmp_shadow_coords.z += 0.0003f;
スクリーンショット:
セルフ シャドウ アーティファクトは完全に消えましたが、前面のシャドウ オーバーフローはさらに悪化しています。
では、セルフ シャドウ アーティファクトとピーター パニング アーティファクトの両方なしでレンダリングすることは可能でしょうか?