Ich verwende unter anderem www.scratchapixel.com, um zu lernen, wie man einen Renderer implementiert. Ich betrachte den folgenden Code von dieser Seite, in dem ein Paket von Photonen betrachtet wird, die sich durch ein Material bewegen. Für jedes Photonenpaket wird das Gewicht auf initialisiert . ist die Absorptionswahrscheinlichkeit.
Der verwirrende Teil für mich ist, wenn von subtrahiert wird . Ich kann sehen, dass dies sinnvoll wäre, wenn das Paket das volle Gewicht von da der nicht absorbierte Anteil der Photonen ist. Wenn zB Absorptionswahrscheinlichkeit ist dann und der Photonen bleiben. Ich kann nicht sehen, wie sinnvoll dies bei nachfolgenden Iterationen ist. Zum Beispiel ist bei Iteration zwei so dass die Hälfte der Photonen bei dieser Iteration absorbiert wird, nicht ein Drittel.
int photons = 10000;
...
int m = 5; // there's 1 over 6 chances for the packet to be absorbed
for (int i = 0; i < nphotons; ++i) {
float w = 1; // set the weight to 1
Vec3f P(0, 0, 0);
Vec3f V(0, 0, 1);
while (1) {
...
float dw = sigma_a / sigma_t;
absorption += dw;
w -= dw;
if (w < 0.001) { // perform russian roulette if weight is small
if (drand48() < 1.0 / m) {
break; // we kill the packet
}
else
w *= m; // adjust weight
}
}
}
quelle