パストレースでの反射または屈折の選択


14

私は自分のパストレーサーに屈折と透過を実装しようとしていますが、その実装方法が少しわかりません。まず、いくつかの背景:

光が表面に当たると、その一部が反射し、一部が屈折します。 ここに画像の説明を入力してください

反射光と屈折光の量は、フレネル方程式で与えられます ここに画像の説明を入力してください

再帰的なレイトレーサーでは、単純な実装は、反射用のレイと屈折用のレイを撮影し、フレネルを使用して加重合計を行うことです。

R=Fresnel()T=1RLo=RLi,reflection+TLi,refraction

ただし、パストレースでは、1つのパスのみを選択します。これは私の質問です:

  • 偏りのない方法で反射するか屈折するかを選択する方法

私の最初の推測は、フレネルに基づいてランダムに選択することです。別名:

float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
    // Reflect
} else {
    // Refract
}

これは正しいでしょうか?または、何らかの補正係数が必要ですか?私は両方の道を進んでいないので。


ロシアンルーレット
-v.oddou

回答:


6

TL; DR

はい、そのようにできます。結果を方向を選択する確率で割るだけです。

完全な回答

マテリアルの反射と屈折の両方を可能にするパストレーサーでのサンプリングのトピックは、実際にはもう少し複雑です。

最初にいくつかの背景から始めましょう。パストレーサーでBSDF(BRDFだけでなく)を許可する場合は、正の半球だけでなく、球全体に統合する必要があります。モンテカルロサンプルは、さまざまな戦略によって生成できます。直接照明の場合はBSDFとライトサンプリングを使用でき、間接照明の場合、意味のある戦略は通常BSDFサンプリングのみです。サンプリング戦略自体には、通常、どの半球をサンプリングするかに関する決定が含まれます(たとえば、反射または屈折を計算するかどうか)。

最も単純なバージョンでは、ライトサンプリングは通常、反射や屈折をあまり考慮しません。光源または環境マップ(存在する場合)を光源の特性に関してサンプリングします。環境マップのサンプリングを改善するには、材料がゼロ以外の寄与を持つ半球だけを選択しますが、通常、材料特性の残りは無視されます。理想的な滑らかなフレネルマテリアルでは、ライトサンプリングが機能しないことに注意してください。

BSDFサンプリングの場合、状況ははるかに興味深いです。説明したケースは、理想的なフレネルサーフェスを扱っています。この場合、2つの寄与方向しかありません(フレネルBSDFは実際には2つのデルタ関数の合計であるため)。積分を2つの部分の合計に簡単に分割できます。1つは反射、もう1つは屈折です。あなたが言ったように、パストレーサーで双方向に行きたくないので、1つを選択する必要があります。これは、数字の1つだけを選択して、数字の合計を推定することを意味します。これは、離散モンテカルロ推定によって行うことができます。加数の1つをランダムに選択し、それが選択される確率で除算します。理想的なケースでは、サンプリング確率を加数に比例させたいが、それらの値がわからないため(それらを知っていれば合計を推定する必要はない)、いくつかの要因を無視して、それらを推定するだけです。この場合、入射光量を無視し、予測としてフレネル反射率/透過率のみを使用します。

したがって、滑らかなフレネルサーフェスの場合のBSDFサンプリングルーチンは、フレネル反射率に比例する確率で方向の1つをランダムに選択し、ある時点でその方向の結果を方向を選択する確率で除算します。推定器は次のようになります。

Li(ωi)F(θi)P(ωi)=Li(ωi)F(θi)F(θi)=Li(ωi)

ωi=(ϕi,θi)Li(ωi)F(θi)P(ωi)F(θi)

マイクロファセット理論に基づいたモデルのようなより洗練されたBSDFモデルの場合、サンプリングはやや複雑ですが、積分全体を部分積分の有限和に分割し、その後離散モンテカルロを使用するという考え方も通常は適用できます。


1
これはおもしろいですが、ある点で混乱しています。「方向を選ぶ確率でその方向の結果を除算する」ことの意味を明確にできますか?バイナリ選択ではなく、連続分布から選択された方向の場合、確率はゼロになりませんか?
trichoplax

1
@trichoplax:はい、しかし、そのパラグラフでは、(誘電体)フレネルBSDFのサンプリング手法について説明していました。理想的には滑らかな表面で、2つのディラックデルタ関数の合計です。このような場合、何らかの確率で方向の1つを選択します。非デルタ(有限)BSDFの場合、確率密度関数に従って方向を生成します。残念ながら、デルタと非デルタのケースは別々に処理する必要があり、コードが少し面倒になります。マイクロファセットBSDFのサンプリングに関する詳細は、たとえばWalter et al。al。[2007]論文。
ivokabel

2
@RichieSams:Walter et。al。[2007]は基本的に誘電体の粗い表面の最新技術ですが、うまく機能させるには、HeitzとD'Eonが2014年の論文「Importance Sampling Microfacet-Based BSDFs可視法線の分布を使用する」。そして、それは、マイクロファセット間の相互反射を無視する単一散乱モデルであり、粗さの値が大きくなると視覚的に暗くなることに注意してください。詳細については、「単一散乱マイクロファセットBSDFモデルでのエネルギー損失の補償」という質問を参照してください。
-ivokabel

5
質問として提案された確率= fresnel()を選択した場合、確率で除算すると、通常乗算されるフレネル係数がキャンセルされることを指摘したかったので(離散的な2ディラックの場合)フレネルファクターをまったく含まない光線の寄与になります。これは標準的な重要度サンプリング理論ですが、混乱を招く可能性がある問題として指摘したいと思いました。
ネイサンリード

2
@ネイサン、あなたの通知を答えに取り入れました。
ivokabel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.