現在、シャドウ マッピングの代替バイアス ソリューションをいくつか実装および修正しています。そしてもちろん、それらをさまざまなソフト シャドウのテクニックと組み合わせています。
そして、PCFにいくつかの問題があります。光の方向とフラグメントの法線の内積が 0 より大きいかどうかをテストすることで、サーフェスの背面をシャドウイングしています。ハード シャドウの場合は問題なく動作します。
したがって、基本的に、フラグメント シェーダーのこのコード行は、任意のオブジェクトの背面をシェーディングします。
isLit= dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ? 0.0 : isLit;
前述のように、ハード シャドウで問題なく動作します。PCF に関して言えば、私の最初の意図は、これを上記のように使用して、フィルター カーネルの現在のテクセルが影にあるかどうかを確認することでした。これは、PCF フィルター カーネルの現在のテクセルをシャドウ テストするための次のステートメントです。
if((currentDepth < shadowMapDepth) && !(dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ))
ただし、オブジェクトの前面からオブジェクトの背面までの「影のエッジ」は、依然としてハードな「影のエッジ」です。PCF フィルター カーネルの任意のテクセルでは、常に現在のフラグメントの法線がテストされるため、これは当然のことです。したがって、フラグメントがオブジェクトの裏側にある場合、このフラグメントは完全に影になります。しかし、「ドット積テスト」を削除すると、オブジェクトの前面から背面へのフェードで、かすかな光のためにアーティファクトが表示されるという問題があります。
「内積テスト」の場合: ご覧のとおり、実際にキャストされた影はきれいに見えますが、オブジェクトの背面にある影はハード シャドウです。
「ドット プロダクト テスト」なし: 「裏側の影」のエッジは明るい前面に向かって柔らかくなり始めますが、それでもハード エッジで終わります。また、その領域のアンダーサンプリングに起因すると思われるいくつかのアーティファクトも確認できます。
「裏側の影」の端に良い(または少なくとも良い)柔らかい影を付けるにはどうすればよいですか? 「照会された仮想シャドウ マップ」のような非常に複雑なアルゴリズムを導入しなければ、もちろんその場合には完璧なソリューションになりますが、これはインタラクティブなアプリケーションのためのものであるため、このような手順を使用することはできません。
それとも、対話型アプリケーションでこのようなエイリアシングを行う可能性がないのでしょうか。
そして、「裏側の影」のハードエッジが許容できると思うかどうか興味がありますか?