02b5c04b2b
The intersection distance offset in Cycles could have returned a denormal floating point value for the input values of 0 (and for the denormal input value). This could lead to a situation when ray is unable to be advanced when it hits an edge between two triangles: the intersection will keep bouncing between two adjacent triangles. This is because the ray->tmin is compared inclusively, and 0 >= <denormal zero>. The solution is to return the smallest possible normalized floating point value from the intersection_t_offset if the input is zero or a denormal value (which is covered by the same t == 0 check). This fix is hard to measure on the user level. The old code did not cause any infinite traversal loop because of the way how the integration is organized (some kernels offset ray.P, others check for the number of bounces). It is possible that this fixes some corner cases of noise: i.e. if some shadow rays falsefully were considered occluded due to reached maximum number of bounces. The actual problematic case was discovered during working on a prototype which had an in-lined intersection loop with the ray tmin offset. Pull Request: https://projects.blender.org/blender/blender/pulls/107364 |
||
---|---|---|
.. | ||
atomic | ||
audaspace | ||
clog | ||
cycles | ||
dualcon | ||
eigen | ||
ffmpeg | ||
ghost | ||
guardedalloc | ||
iksolver | ||
itasc | ||
libc_compat | ||
libmv | ||
locale | ||
mantaflow | ||
memutil | ||
mikktspace | ||
opencolorio | ||
opensubdiv | ||
openvdb | ||
quadriflow | ||
renderdoc_dynload | ||
rigidbody | ||
sky | ||
utfconv | ||
wayland_dynload | ||
CMakeLists.txt |