レイトレーシングでのアンチエイリアス/フィルタリング


20

レイトレーシング/パストレースにおいて、画像のアンチエイリアスを行う最も簡単な方法の1つは、ピクセル値をスーパーサンプリングし、結果を平均化することです。IE。ピクセルの中心を通してすべてのサンプルを撮影する代わりに、サンプルをある量だけオフセットします。

インターネットを検索してみると、これを行うために多少異なる2つの方法が見つかりました。

  1. 必要に応じてサンプルを生成し、フィルターで結果を比較します
  2. フィルターの形状に等しい分布を持つサンプルを生成します


生成と計量

基本的なプロセスは次のとおりです。

  1. 必要に応じてサンプルを作成します(ランダム、成層、低差異シーケンスなど)
  2. 2つのサンプル(xおよびy)を使用してカメラレイをオフセットします。
  3. レイでシーンをレンダリングする
  4. フィルター関数とピクセル中心を基準としたサンプルの距離を使用して重みを計算します。たとえば、ボックスフィルター、テントフィルター、ガウスフィルターなど) フィルター形状
  5. レンダリングから色に重みを適用します


フィルターの形で生成する

基本的な前提は、逆変換サンプリングを使用して、フィルターの形状に従って分散されるサンプルを作成することです。たとえば、ガウスの形で分布するサンプルのヒストグラムは次のようになります。
ガウスヒストグラム

これは、正確に実行するか、関数を個別のpdf / cdfにビニングすることで実行できます。smallptは、テントフィルターの正確な逆累積分布関数を使用します。ビニング方法の例はこちらにあります


ご質問

各方法の長所と短所は何ですか?そして、なぜあなたは他の上に1つを使用するのですか?私はいくつかのことを考えることができます:

Generate and Weighは最も堅牢であるようであり、任意のサンプリング方法と任意のフィルターの任意の組み合わせが可能です。ただし、ImageBufferの重みを追跡し、最終的な解決を行う必要があります。

フィルターの形状で生成は、負のpdfを持つことができないため、正のフィルター形状のみをサポートできます(つまり、Mitchell、Catmull Rom、またはLanczosはサポートしません)。ただし、前述のように、重みを追跡する必要がないため、実装が簡単です。

ただし、最終的には、メソッド2はメソッド1の単純化と考えることができます。これは、本質的に暗黙的なボックスフィルターの重みを使用しているためです。


声を出して考えてください...フィルターのネガティブ部分を別々にモデル化して、2つのサンプルセットを生成できます。1つはポジティブとして、もう1つはネガティブとして扱われますか?これにより、2番目のアプローチに任意のフィルターが許可されますか(フィルターの形で生成)?
-trichoplax

多分?少しそれをいじる
RichieSams

1
OK、関数のゼロを追跡する場合、pdfに出力をabs()できます。その後、サンプリング時に、自分がネガティブかどうかを確認できます。サンプルコードはこちら:gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

回答:


9

このトピックに関する2006年のすばらしい論文、Filter Importance Samplingがあります。彼らはあなたの方法2を提案し、特性を研究し、一般的にそれを支持して出てきます。彼らは、この方法はピクセルに均等に寄与するすべてのサンプルに均等に重み付けし、それによって最終的なピクセル値の変動を減らすため、レンダリング結果がより滑らかになると主張しています。モンテカルロレンダリングでは、重要度サンプリングが重み付きサンプルよりも低い分散を与えるという一般的な格言なので、これはある程度理にかなっています。

方法2には、各ピクセルの計算が他のすべてのピクセルから独立しているため、並列化がやや簡単であるという利点もありますが、方法1では、サンプル結果は隣接するピクセル間で共有されます(したがって、ピクセルが並列化されている場合は、何らかの方法で同期/通信する必要があります)複数のプロセッサ)。同じ理由で、方法1よりも方法2の方が適応サンプリング(画像の高分散領域のサンプル数が多い)を行う方が簡単です。

この論文では、Mitchellフィルターを使用して実験を行い、フィルターのabs()からサンプリングし、@ trichoplaxが推奨するように、各サンプルに+1または-1のいずれかを重み付けしました。しかし、これにより実際に分散が増加し、方法1よりも悪化したため、方法2は正のフィルターにのみ使用できると結論付けています。

そうは言っても、この論文の結果は普遍的に適用できるわけではなく、どのサンプリング方法がより良いかは、多少シーンに依存するかもしれません。この質問を調査するブログ投稿を書きまし2014年に独立して、フルレンダリングではなく合成「イメージ関数」を使用し、方法1を使用して、コントラストの高いエッジをよりうまくスムージングすることにより、視覚的に快適な結果を得ることができました。Benedikt Bitterliさんも、その投稿でレンダラーに関する同様の問題(方法2を使用した場合の光源周辺の過剰な高周波ノイズ)を報告しているとコメントしています。さらに、メソッド間の主な違いは、結果として生じるノイズの周波数であることがわかりました。メソッド2は、より高い周波数の「ピクセルサイズの」ノイズを提供し、メソッド1は、2〜3ピクセルの「粒子」ノイズを提供しますが、ノイズの振幅は両方で類似していたため、どの種類のノイズがそれほど悪くないかは、おそらく個人的な好みの問題です。


ありがとう!これらは素晴らしいリソースです。だから、最後に、3つの方法がありますか?1.フィルターの形状に生成3.生成し、スプラットせずに計量2.生成し、スプラッティングと計量
RichieSams

GenerateとWeight をスプラッティングと並列化する方法を探求する論文、ブログなどを知っていますか?私の頭上では、タイルごとにミューテックスを持つか、各ピクセルをアトミックにすることができます。
RichieSams

2
@RichieSams実際に「スプラッティングせずに生成および計量」を使用する理由がわかりません。これは、いずれにしてもフィルター重要度サンプリングよりも悪いようです。「生成して重量を量る」とは、飛び散ることを意味すると想定していました。スプラッティングの並列化については、画像をタイルに分割する方法の1つですが、各タイルに2〜3ピクセルの境界線を付けて、タイルの端を横切るスプラットをキャッチします。次に、最終パスで、境界線のあるタイルを最終的な画像に加算合成します。
ネイサンリード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.