モンテカルロ パス トレーシングを実装しようとして、ライト サンプリング手順で問題が発生しました。
通常、手順は次のようになります。
- カメラ (または前のポイント) から開始してサーフェス ポイントに到達するまで光線をトレースします。
- 表面のポイントに到達したら、シーン内の光源にランダムにポイントを生成します。
- そのライトがサーフェス上の現在のポイントに到達できるかどうかを表すジオメトリ項を計算します (この項は 0 または 1 のいずれかです)。
- このジオメトリ項が 1 の場合、減衰係数 (ライトの距離) とマテリアルの BRDF を掛けて、そのライトの寄与を計算します。
どのようにランダムに選択されるかについての詳細は省きましたが、当面は気にしないでください (たとえば、「ディストリビューション レイ トレーシングにおける照明器具のサンプリング」を参照してください)。
問題は、私が見ているように、BRDF と光源の光の分布の両方が実際の関数ではなく、むしろ尺度であるということです。
たとえば、完全に反射する鏡の BRDF は、入射角ごとに、反射方向のディラック デルタ「関数」です (つまり、1 点で支持され、その点で 1 の質量を持つ尺度)。同様に、ポイント ライト (エリア ライトとは対照的に) は、密度関数とは対照的に、ディラック デルタによってモデル化されます。
適切な重要度のサンプリングが可能になるため、区別を明確にすることが重要と思われます。たとえば、BRDF をサンプリングする場合、次のいずれかを実行できます。
- すべての出射方向を均一にサンプリングし、対応する反射分布「関数」でスケーリングします。
- BRDF に従って直接サンプリングし、後でスケーリングしません。
複雑な BRDF では完全な重要度のサンプリングは不可能であるため、その間のすべてが可能であり、重要です。
ここで、BRDF が実際にディラック デルタである場合、BRDF に従ってサンプリングすることが非常に重要になることがわかります。 、方向を一様にサンプリングするときに選択する確率は0です)が、ラッキーヒットして反射方向(質量がある)を取得した場合、寄与を無限に大きくする必要があります! BRDF に従ってサンプリングする場合、常に反射方向を生成し、何もスケーリングする必要はありません (特に、無限に実行されることはありません)。
私の問題は次のとおりです。BRDFに光の寄与をどのように「掛ける」のですか。それらが両方とも一般的な尺度であり、関数だけではない場合です。BRDF の重要度サンプリングとシーン内のライトの分布の両方を考慮する場合、このステップで適切に「重要度サンプル」を作成するにはどうすればよいでしょうか? (ライトのサンプリング手順では、ライトの分布と BRDF の両方を考慮して、無限大を回避する必要があります。)
理想的には、無限大を生成しないサンプリング手順が必要です。無限大は、(上記のように) 悪いサンプリング メカニズムのアーティファクトであるべきです。したがって、後続の 4 つのシナリオでは、計算された寄与は常に有限でなければなりません。
- エリア ライトを使用した連続 BRDF (例: ランバート ディフューズ マテリアル)
- ポイントライトを使用した連続BRDF
- エリア ライトを使用した個別の BRDF (例: 完全なミラー)
- ポイント ライトを使用した個別の BRDF
もちろん、理想的にはこれは BRDF とライトの両方の任意の測定で機能しますが、上記の 4 つのケースを正しく取得できることが、ほとんどの作業が行われている場所のようです。