かなり長い記事になってしまいましたが、読んでくださった方、ありがとうございます!
そのため、私自身の個人的なプロジェクトのために、作成したレイ トレーサーで使用するフォトン マップを実装していますが、レンダリングの方程式を理解するのに苦労しています。一般的なフォトンとコースティクス フォトンの両方を分散させ、それらを KD ツリーに格納し、レンダリングに使用するためにツリー内で効率的に検索するコードを既に作成しました。
したがって、レンダリング方程式は次のように与えられます。 Lr(x,w) = Integral( fr(x, w', w) * Li(x, w') cos(Theta i) * dw'i )
ここで、x はシーン内の特定のポイント、w' は入射光の方向、w は反射光、Theta_i は入射角度です (私はそう思います)。
最初の質問:
これは、BRDF (双方向反射率分布関数) である項 fr(x, w', w) に関するものです。これを正しく理解しているかどうかはわかりませんが、基本的にBRDFは基本的にシェーディング機能ですか?つまり、私のプログラムの基本的なレイ トレーシング機能のために、直接照明と反射を行うためにフォン反射モデルを使用しました。私のフォンリフレクションコードを再利用し、それを使用して積分でBRDFを表すことは有効ですか?
2 番目の質問: 私のもう 1 つの質問は、レンダリングの方程式をその構成要素に分解するときに関するものです。たとえば、拡散相互反射を計算するには、次のようにします。
拡散反射率 = Integral( fr,d(x, w', w), * Li,d(x,w') cos(theta_i) dw'i)
そのため、任意の時点で、その周囲に拡散反射光子の束を既に保存しています。この方程式から私が理解していることから、単純に各光子の強度にフォン モデルの拡散成分を掛け、角度の余弦を掛けて、それらをすべて加算するだけでよいのでしょうか?
その特定のセグメントのコードは次のようになります。
Color result = Color(0,0,0) // r = g = b = 0;
for(int i = 0; i < # photons surrounding point x; i ++)
{
result += Phong_Diffuse(photon_i, x, camera_ray) * photon_i.color * photon_i.angle
}
次に、これを Direct Illumination ( Phong_DIFF_&_SPEC(light_source, x, camera_ray) ) から取得した色とミラー反射から取得した色に追加します。私がここでやっていることは正しいですか?
思うような効果が得られていないようです。理由の 1 つは、各フォトンが Light_source / num_Photons の強度を持つようにフォトンをスケーリングすると、1 か所に数百個のフォトンがあっても、合計 500,000 個のフォトンがあるため、シーンにほとんど影響を与えないためです。また、フォトンをスケーリングしたり、スケーリングをごまかしたりしないと、色がまだずれているように見えます。
さらに、Cornell_box でテストを行った場合、拡散反射を使用しても、他のコーネル ボックスで見た写真に基づくと、天井は非常に暗いままで、はるかに明るいはずです。
フォトンを直接視覚化しようとしたため(したがって、シーン全体がフォトンがある色付きのドットで構成されているだけです)、フォトンが大まかに見えたので、フォトンを保存する方法に問題があるとは思いません均等に分布し、正しい場所にあり、特定のポイントに最も近いフォトンを収集していることをテストすると、それも機能しているようです.
この長いとりとめのない混乱をわざわざ読んでくれた人、そして返信に時間を割いてくれた人に感謝します! =)