1

ライト ビューの外側にあるポイントをサンプリングするときに、シャドウ マップに問題が発生します。これは、GL_CLAMP または GL_CLAMP_TO_EDGE に設定された GL_TEXTURE_WRAP のテクスチャ パラメータでシャドウ マップが作成されるたびに得られるものです。

ここで私が判断したのは、マップの影がある側の影マップの外側のすべてのポイントが影にあると見なされ、影のない側のマップの外側のすべてのポイントも影がないと見なされるということです。これは GL_CLAMP と GL_CLAMP_TO_EDGE の予想される動作だと思いますが、Web で見つけたさまざまなシャドウ マッピングの例ではこの問題は見られませんでした。これらの問題のいくつかは、GL_CLAMP_TO_BORDER を使用して境界線の色を設定することで解消されますが、これも私が見た例のいずれにも見られた修正ではありません。これは、スポットライトをシャドウイングするときに予想される問題ですか? もしそうなら、通常の修正方法は何ですか?

4

1 に答える 1

6

GL_CLAMP_TO_EDGE を使用すると、シャドウ テクスチャの最初と最後のピクセルが各方向に繰り返され、予測不可能な結果が生じます。

ここに画像の説明を入力

境界線にクランプして境界線の色を (1,1,1,1) に設定すると、境界線がきれいになりますが、影はまったくありません。

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor,new float[] {1f,1f,1f,1f});

投影サイズを拡張することが、シーン全体で期待どおりにシャドウイングを行う唯一の方法です (lightSize が適切なサイズである正投影の例)。

lightProjection = Matrix4.CreateOrthographicOffCenter(-lightSize, lightSize, -lightSize, lightSize, lightZNear, lightZFar); 

しかし、これを行うと、シャドウ マップの解像度が失われ、いくつかの一般的な手法でフィルタリングする必要があります。PCF などの「ソフト シャドウ フィルタリング」を参照してください。

「カスケード シャドウ」などの手法を使用して、シーンの距離に応じて複数のシャドウ マップの解像度を処理するよりも、一歩前進します...

于 2014-03-19T23:42:22.873 に答える