# Is this Russian roulette code correct?

I'm using www.scratchapixel.com among other resources to help me learn how to implement a renderer. I am looking at the following code from this page where a packet of photons moving through a material is being considered. For each photon packet, the weight $w$ is initialised to $1$. $dw$ is the probability of absorption.

The confusing part to me is when $dw$ is subtracted from $w$. I can see this would make sense when the packet has full-weight of $1$ because $1 - dw$ is the unabsorbed proportion of photons. E.g. if probability of absorption is $33\%$ then $w = 1 - 0.33 = 0.67$ and $67\%$ of the photons remain. I can't see how this makes sense on subsequent iterations. For example, on iteration two, $w = 0.67 - 0.33 = 0.34$ so half the photons are absorbed on this iteration, not a third.

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
}
}
}


## 1 Answer

I think you're right and the subtraction is a mistake. The code should rather be multiplying the fraction of photons not absorbed into the weight. Something like:

float fraction_absorbed = sigma_a / sigma_t;
absorption += w * fraction_absorbed;
w *= (1.0f - fraction_absorbed);


This makes absorption the total fraction of photons absorbed so far, and w the fraction of photons remaining.