Estou usando www.scratchapixel.com entre outros recursos para me ajudar a aprender como implementar um renderizador. Estou observando o código a seguir nesta página, em que um pacote de fótons que se move através de um material está sendo considerado. Para cada pacote de fótons, o peso é inicializado em . é a probabilidade de absorção.
A parte confusa para mim é quando é subtraído de . Percebo que isso faria sentido quando o pacote tiver peso total de porque é a proporção não absorvida de fótons. Por exemplo, se a probabilidade de absorção for então e dos fótons permanecem. Não vejo como isso faz sentido nas iterações subseqüentes. Por exemplo, na iteração dois, portanto metade dos fótons são absorvidos nessa iteração, e não um terço.
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
}
}
}