J'utilise www.scratchapixel.com entre autres ressources pour m'aider à apprendre à implémenter un moteur de rendu. Je regarde le code suivant de cette page où un paquet de photons se déplaçant à travers un matériau est envisagé. Pour chaque paquet de photons, le poids est initialisé à . est la probabilité d'absorption.
La partie déroutante pour moi, c'est quand est soustrait de . Je peux voir que cela aurait du sens lorsque le paquet a un poids total de parce que est la proportion non absorbée de photons. Par exemple, si la probabilité d'absorption est puis et des photons restent. Je ne vois pas comment cela a du sens sur les itérations suivantes. Par exemple, à l'itération deux, donc la moitié des photons sont absorbés lors de cette itération, pas un tiers.
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
}
}
}
la source