Estoy usando www.scratchapixel.com entre otros recursos para ayudarme a aprender cómo implementar un renderizador. Estoy mirando el siguiente código de esta página donde se está considerando un paquete de fotones que se mueven a través de un material. Para cada paquete de fotones, el peso se inicializa a . es la probabilidad de absorción.
La parte confusa para mí es cuando se resta de . Puedo ver que esto tendría sentido cuando el paquete tiene un peso total de porque es la proporción no absorbida de fotones. Por ejemplo, si la probabilidad de absorción es entonces y queda el de los fotones. No puedo ver cómo esto tiene sentido en las iteraciones posteriores. Por ejemplo, en la iteración dos, por lo que la mitad de los fotones se absorben en esta iteración, no un tercero.
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
}
}
}