There are multiple ray tracing issues that could happen due to floating-point errors. This slide illustrates one of them. Here we spawn a ray from the camera which intersects the horizontal surface (horizontal line in the image). Due to floating point error, computed intersection point ends up below the surface (the bottom blue circle). Now, we spawn a ray from the intersection point to the light source. This ray intersects the surface again (upper blue point). Therefore, we incorrectly intersect the surface twice and decide that the first intersection point is in shadow. (based on reading the pbr book)

sagoyal

oh I see, I think a "fix" I've seen before is that given an intersection point we always push it up a small scaling factor (epsilon) in the direction normal to the surface and use this new shifting point to do further ray casting.

alpaca

@sagoyal, indeed looks like that's what pbrt does. They also keep track of error bounds to compute the "epsilons".

There are multiple ray tracing issues that could happen due to floating-point errors. This slide illustrates one of them. Here we spawn a ray from the camera which intersects the horizontal surface (horizontal line in the image). Due to floating point error, computed intersection point ends up below the surface (the bottom blue circle). Now, we spawn a ray from the intersection point to the light source. This ray intersects the surface again (upper blue point). Therefore, we incorrectly intersect the surface twice and decide that the first intersection point is in shadow. (based on reading the pbr book)

oh I see, I think a "fix" I've seen before is that given an intersection point we always push it up a small scaling factor (epsilon) in the direction normal to the surface and use this new shifting point to do further ray casting.

@sagoyal, indeed looks like that's what pbrt does. They also keep track of error bounds to compute the "epsilons".