回答:
実際、ラジオシティに必要なのはそれだけです。2つの異なる(ただし等しい)公式があります。1つは、各パッチ(おそらく顔)から光を「放射」または放射することであり、もう1つは、各パッチに光を「収集」または受信することです。これを何度も繰り返し行うと、ラジオシティが得られます。
最初のステップは、どちらの方法にも光源がなければならないため、光がどこから発生するかを理解することです。ギャザーメソッドを実行する場合は、ポイントライトをうまく処理できないことを警告する必要があります。パッチを光でシードする(個別に計算する)か、奇妙な結果が得られます。radiateメソッドでは、通常どおりポイントライトから放出しますが、他のパッチからのレシーバーとしてそれらを無視します。
任意の数のバウンス(または反復)の後で停止することができますが、実行する回数が多いほど、ソリューションは向上します。キューブの両側をパッチと見なすことができるため、パッチを簡単に作成できます。より詳細なものが必要な場合は、それらの面をさらに細かく分割できます。
放射の例では、これはループの基礎として使用できます。
while(!done) {
foreach Patch a {
a.shootRays(n);
foreach ray r {
Patch b = r.firstIntersectingPatch();
float modifier = 1 / ((distance(a,b)^2)
b.incidentLight += (a.exidentLight / n) * modifier;
}
}
foreach Patch a {
float modifier = a.absorption;
a.exidentLight = (a.incidentLight * modifier) + a.emission;
a.incidentLight = 0;
}
done = goodEnough() ? true : false;
}
収集メソッドの場合、最初のループが少し異なります。
foreach Patch a {
a.shootRays(n);
foreach ray r {
Patch b = r.firstIntersectingPatch();
float modifier = 1 / ((distance(a,b)^2)
a.incidentLight += b.exidentLight * modifier;
}
a.incidentLight /= n;
}
最初のモディファイヤは、入射光のパッチごとのモディフィケーションに使用されます。最も一般的な使用法は、上記のように距離からの減衰です。2番目のモディファイヤは、マテリアルの吸収など、入射光をグローバルに変更するためのものです。ほとんどのパッチでは、a.emission変数は0です。
0以外のエミッション値を持つのは、光源であるもの(または、上記のギャザーメソッドを使用している場合は点光源の影響を直接受けるもの)のみです。
goodEnough()関数には多くのことが考えられます。反復回数を数えるだけの場合もあれば、シーン内の光の総量を調べる場合もあれば、他に考案したテストの場合もあります。この部分は本当にあなた次第であり、あなたが十分に良く見えると思うものはまだ妥当な時間で終了します。
撮影する光線が多いほど、ソリューションは正確になりますが、プロセスは遅くなります。同じことは、パッチの数とループの反復数にも当てはまります。最終的な光の値を保存する方法はあなた次第です。テクスチャ内にある場合もあれば、キューブに値として格納されている場合もありますが、適切な数のパッチを使用してリアルタイムで実行するのは現実的ではないと思います。
下のリンクに、ラジオシティの最も優れた説明の1つがあります。
あなたがそれをよく知っているとしても、それは読む価値があります。とても面白い :)