1

http://www.kevinbeason.com/smallpt/のソースを読もうとしていますが、特に把握できないことが 1 つあります。行番号 55 には、次のように書かれていますf=f*(1/p)

それは何ですか?それは何をするためのものか?さらに重要なことに、なぜこのように正確に読み取れるのでしょうか。画像をより速く収束させるためのある種のヒューリスティックはありますか?

言い換えれば、私が見た文学で:

function radiance
     ...
    return Le(x) + R(p) * radiance(rn)

重要なことは、R(p)それが何をするのかよくわかりませんが、99%はf上からではありません..

誰かがこれについて少し光を当てることができますか?

4

1 に答える 1

1

あなたの答えはこのスライドにあると思います。これには、 の明示的な照明バージョンの行ごとの説明が含まれており、smallpt75% 長くなるように再フォーマットされています。

つまり、 line#55は関数 内にあり、そこでradianceray に沿った放射輝度が推定されます。

if (++depth>5) 
    if (erand48(Xi)<p) f=f*(1/p); 
    else return obj.e;
  • まず、この関数radianceは再帰関数です (自分自身を呼び出します)。
  • レイがガラスの表面に当たると、レイ トレーサは、屈折レイを計算するために、ガラスに入射するか、ガラスから出るかを判断する必要があります。
  • fオブジェクトの色です。
  • p表面色の最大成分 (r,g,b) です。
  • の行#55で、Russian Roulette再帰の深さが より大きい場合に実行し5ます。
  • を使用して、表面の反射率に基づいて再帰をランダムに停止しpます。
  • f=f*(1/p)is using -各コンポーネントの正規化を行うためpの最大コンポーネント、f

となることによって、

f.x = f.x / (max(f.x, f.y, f.z))
f.y = f.y / (max(f.x, f.y, f.z))
f.z = f.z / (max(f.x, f.y, f.z))

このコードでは、 for*ではなく for をオーバーロードする演算子を定義しています。/そのため、f=f*(1/p)代わりにf=f/p.

于 2012-11-03T00:48:08.523 に答える