間接光の寄与を計算するときに、コサイン加重半球サンプリングでNdotLが必要ですか?


12

均一な半球のサンプリングから余弦加重の半球のサンプリングに変換するとき、記事のステートメントに混乱します。

私の現在の間接的な貢献は次のように計算されます:

Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)

内積がcos(θ)の場合

しかし、より良いサンプリングに関するこの記事(http://www.rorydriscoll.com/2009/01/07/better-sampling/)では、著者はPDFが(cos(θ)/ pi)であることを示唆しており、その証拠はありません。 NドットL計算。

私の質問は-PDFに含まれているため、通常のドットrayDirectionを実行する必要がないということですか、それともPDFに追加されているのですか?

回答:


12

実際には、常にコサイン項を乗算する必要があります(これはレンダリング方程式の一部です)。ただし、レイトレーシングを使用して間接拡散を実行し、モンテカルロ統合を行う場合(この場合は最も一般的な手法です)、各サンプルの寄与をPDF除算する必要があります。これはよくここで例証されます

また、上記のリファレンスでは、PDFにレンダリング式にも含まれる用語が含まれている場合は、これらの用語をキャンセルして、必要に応じてコードを最適化できます。

拡散表面のBRDFがρ/πであることを忘れないでください。ここで、ρは表面アルベドを表します。したがって、結果をπで除算する必要があります。間接拡散コンポーネントの場合でも、castRayの結果を確率変数のPDFで除算する必要があることを忘れないでください。確率変数は、この章で前述したように、1 /(2π)です。indirectDiffuseを1 /(2π)で除算することは、この値に2πを掛けることと同じです。また、アルベドもπで除算されるため、コードを簡略化できます...

同様の状況があります。コサインサンプリングのPDFを見ると、条件をキャンセルできることがわかります。これは、それらが厳密に必要ではないという意味ではありません。それらは、コードをわずかに最適化することを可能にする(そして、いくつかの除算、乗算などを回避する)互いにキャンセルするだけです。ここでのマイクロ最適化の方がいいです...最適化されたコード(これは適切にコメントされていないことが多い)を見るだけで理論を学習しようとすると混乱する可能性があります。

cosθPDF=cosθcosθπ=


1
ありがとうございました!それは理にかなっている。直感的にそれが必要であることは知っていましたが、それが最適化であることを認識していませんでした。
スティーブン

5
これが明示的であることを確認してください。コサイン加重半球は命令が少ないため最適化であるだけでなく、より速く収束するため最適化でもあります。より良い結果を得るために必要なサンプル数は少なくなります。これは重要性サンプリングの形式です。
アランウルフ

まさに-ライトマッパーでの間接的な計算のためにサンプルの数を減らしようとしているので、それが私の欲望でした。
スティーブン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.