2

基本的なシャドウ マッピング手法に関する簡単な 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;

スクリーンショット:

ここに画像の説明を入力

セルフ シャドウ アーティファクトは完全に消えましたが、前面のシャドウ オーバーフローはさらに悪化しています。

では、セルフ シャドウ アーティファクトとピーター パニング アーティファクトの両方なしでレンダリングすることは可能でしょうか?

4

1 に答える 1

2

ここに画像の説明を入力

これはかなりうまくいきます。鋳造面が受け面に非常に近いところに小さな隙間があります。

シェーダーで正しく理解するための主な事柄は、影がどのように適用されるかです。シャドウ/オクルージョンの値によって、追加された直接光、拡散、鏡面反射の項のみをスケーリングします (周囲の項はそのままにしておく必要があります)。簡単なチェックは、影にあるサーフェスが、シャドウイングが無効になっている光から離れた面とまったく同じに見えることです。影は物事を暗くするだけではなく (finalColour *= 1.0-shadowScaleまたはfinalColour -= shadow)、直接的な光が存在しないことを意味します。これは、複数のライトが関係している場合に非常に重要になります。

于 2014-10-17T13:33:31.107 に答える