シャドウマッピングでの投影エイリアスの処理


15

3D印刷用の小さな建物を作るために、単純な手続き型3Dモデリングをいじっています。例:

建物


モデルを画面上で読みやすくするために、単一の指向性ライトの基本的なシャドウマッピングを実装しました。シーンは変わらないので、シーンの軸に合わせたボックスを使用してシャドウマップを1回レンダリングするだけで、シャドウマップの境界がどうあるべきかを把握します。影と境界線は、すべての行列が正しいように見えますが、少し近づくとひどく見えます:

タワーのクローズアップ

私が行った読書から、私はピーターのパンニングとそれに対して何ができるかを理解していますが、ぼんやりしたエッジは射影エイリアシングの一種であると信じているため、私の基本的な実装では何かが間違っていると思います。

ピクセルシェーダーをハッキングして、シャドウテクセルの境界を表示しました。

テクセル境界の表示

テクスチャにバイリニアフィルタリングを適用しました(これがないと、深刻な影のにきびができます)。悲しいことに、PCFでの私の試みも失敗しました-それはちょうど不規則に見えます:

ここに画像の説明を入力してください

バイリニアフィルタリングを無効にした単一のサンプルケースを次に示します。

ここに画像の説明を入力してください

これは「典型的な」射影エイリアシングのように見えますか?おそらくカスケードでシーンにクリップされた視錐台を使用したシャドウマップの動的レンダリングは、問題に対処できますか?

編集:私が得るものを示すために、双線形フィルタリングのクローズアップ、ポストシャドウ比較を追加します。内側の端が原因で、悪い影のにきびが現れます。スタックされた仮想ブロックを使用してモデリングしており、適切な結合操作を行っていません。私の読書から、多面体にブール演算を実装することは簡単ではありませんが、静的なシャドウボリュームを実装するだけでなく、いくつかの3D印刷ソフトウェアをクリーンアップすることもできます。

バイリニアフィルタリング

回答:


10

許容できる品質のシャドウマッピングは、かなりの旅です。最初のステップ-シーン全体を静的に含む基本的なシャドウマップ-を実装しました。これは、カメラビュー空間の比率でレンダリングされたシーンのテクセルサイズに対するライトビュー空間のシャドウマップテクセルサイズが非常に大きく、エイリアスが発生することを意味します。この比率を1:1に近づけるには、次のようなテクニックがあります。

  • 最も簡単な方法は、シャドウマップのサイズを大きくして、最適なパフォーマンスで値を見つけることです。
  • シャドウマップをカメラビューの錐台に合わせます。次に、シャドウマップはシーンのより小さな部分を網羅するため、エイリアシングが減少し、
  • これはCSMに改善できますが、CSMは同じことを行いますが、錐台の各スライスの中心点に基づいて、ライトビューマトリックスの異なる中心位置でカスケードごとにシーンをレンダリングする必要があります。

影の端を滑らかにする基本的なテクニックのいくつか:

  • 明らかにPCFですが、PCF実装を組み込みハードウェアPCF(Openglで-を使用sampler2DShadow)と組み合わせることが推奨されます。これにより、あなたの側からのループの繰り返しが少なくなり、PCFが安くなり、
  • 回転ポアソンディスクを使用して、エッジのブロックノイズをノイズに交換できます。シャドウマップからのサンプリングに使用されるサンプルは、PCFループの反復ごとにランダムに回転します。

次のようなエッジスムージングテクニックを調べることもできます。

  • シャドウマップをMSAAが適用されたフレームバッファにレンダリングする。
  • 補間によるPCFのさらなる強化、
  • 時間ブレンドを使用したサンプル数の増加。

PCFの基本的な手法は、にきびにきびに悩まされています。これは、シャドウテストでオフセットを適用することで修正できます。このオフセットのサイズの計算も研究分野です。

他のより高度なシャドウマップメソッドには、次のものがあります。

  • 指数シャドーマップ分散シャドーマップ -ほとんどの場合、シャドーニキビに悩まされることはなく、ブロックのない滑らかなエッジを提供しますが、光漏れの状況によっては、
  • 指数分散シャドウマップ-おそらく最も高度な2D深度マップシャドウマッピングの手法は、VSMの優れた滑らかさを組み合わせて、メモリ使用量を2倍にし、光漏れを解消します。
  • より近いソフトシャドウの割合 -さまざまな半影のサイズで従来のシャドウマップを強化する基本的な手法、
  • マルチビューシャドウマップ -エリアライト上に配置された複数の手法の複数のシャドウマップ。さまざまな半影サイズのリアルなソフトシャドウを計算します。
  • ディープシャドウマップ - シャドウによる体積散乱を強化するため、
  • リアルタイムレイトレースシャドウ-おそらく未来。

あなたはPCFで失敗しなかった、それはそのように見える:)

カメラビュースペースのシャドウマップにガウスぼかしを適用する方法があればいいのにと思いますが、期待どおりに機能しません。


このコメントの一部はあなたの答えに感謝しているので、私はあなたがそこから通知を受け取らないのであなたに知らせると思った。
センモウヒラムシ

はい、見ましたがありがとう。
narthex

1

あなたは「...テクスチャで双線形フィルタリング...」と言いました。シャドウマップの深度値を補間しているようです。シャドウマップで補間を使用する正しい方法は、シャドウテストの結果に適用することです(覚えている限り、OpenGLはそれをサポートしています)。シャドウテストの結果の補間とPCFを組み合わせて、はるかに優れた結果を提供することもできます。ただし、お気づきかもしれませんが、エイリアシングは常にシャドウマッピングを追求するペストです:)

シャドウマッピングに関するソリューションを探していることは理解していますが(実装が非常に簡単であっても)、シャドウボリュームの使用を検討したことはありますか?実装ははるかに複雑ですが、エイリアシングにまったく悩まされることはなく、あなたの目的にうまく合うと思います。


答えてくれてありがとう!探している結果を得るには、シャドウボリュームに切り替えることが適切な場合があります。「補間」の下で提供されるコードフローリンクは非常に便利です-ありがとう!
ダニエルMゲッセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.