The part that’s not reflected is absorbed. (Or, in the case of a transparent surface, the part that’s not reflected is transmitted.)

So if you calculate reflected light = incoming * material color, then that’s the reflected light, period. No need to do any randomization type of stuff.

This tends to create photons with a wide distribution of values. Some
photons are directly from a light source and will be very bright while
others have been bounced a few times and are dim. This is not *wrong* -
you’ll still get a correct rendering result - but my understanding is
that the trouble with this is it tends to worsen the noise. You’ll need
more photons and/or more rendering time to get a high-quality image.

So in photon mapping, people often take some steps to try to keep all
the photons at about the same power. One way to do this is, instead of
multiplying each photon by the material color when it gets reflected,
you randomly either absorb the photon or reflect it. If you forget about
colors and think about monochrome rendering for a minute, you can see
that if you have a surface that reflects 20% of the light, that it’s
equivalent to either reflect all the photons and multiply each one’s
power by 0.2, *or* reflect only 20% of the photons but keep the same
power (the rest are absorbed, i.e. thrown away).

In full-color rendering you have three different color channels (or
more) but you can only pick one probability to reflect the photon, so
people usually pick the max of the three colors or the average of them.
Then you have to multiply the photon by material color *divided by*
whatever probability you used. That ensures the photon gets colored
properly, but the amount of reflected light is correct overall.

I’ve read many things all different, and kind of confusing. When a light hit a surface, it is either reflected in part or in whole, or absorbed, to preserve and distibute the light energy without adding or removing from it (conservasion of energy), but is the following correct and true?… if frand(0..1) < material.color.max(0..1) then reflect else absorb, and if reflect, then the reflected.light = incoming.light * material.color?