最近、従来のシャドウマッピングのシャドウニキビ問題の解決を模索しながら、指数シャドウマップを実装しました。トリックはありましたが(ニキビはまったくありません)、同時に他の許容できないエラーが発生しました。
深度マップのぼかしには、最小のsigma = 1のガウスぼかしを使用します。
シャドウマップのテスト:
float occluder = texture(shadowMap lightCoords.xy).r;
float c = 5000.0;
float receiver = lightCoords.z;
float shadow = exp(c*(occluder-receiver));
shadow = clamp(shadow, 0.0, 1.0);
小さなc係数c=100.0
:
許容できない光のにじみ
高いc係数でc=5000.0
:
光のにじみはありませんが、高周波の細部が「腫れ」ているように見えます。
最適なcを見つけることができません-でも光のにじみが現れc=3000.0
、高周波のシャドウエラーが既に発生しています。デプスマップをぼかすことは役立ちませんが、エイリアシングが発生します。
そして私の質問は、このテクニック(ESM)をどのように改善できるか、または別のテクニックを探す必要があるかどうかです。ウィッチャー3やフォールアウト4などの最新のゲームで見られるように、優れたパフォーマンスを備えた高品質のシャドウは間違いなく可能だと思います。