Fix #19: Verify sun traces with a reverse occlusion trace

This commit is contained in:
Jarrod Doyle 2025-02-23 20:13:59 +00:00
parent 8864993463
commit 651243d91f
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
1 changed files with 5 additions and 4 deletions

View File

@ -1068,16 +1068,17 @@ public class LightMapper
// TODO: direction should already be normalised here
private bool TraceSunRay(Vector3 origin, Vector3 direction)
{
// Avoid self intersection
origin += direction * MathUtils.Epsilon;
var hitResult = _scene.Trace(new Ray
{
Origin = origin,
Direction = Vector3.Normalize(direction),
});
if (hitResult)
// If origin is very close to a wall, the initial trace to the sun sometimes misses the wall. Now that we have
// backface culling enabled in Embree, this can result in reaching a sky when we shouldn't.
// By doing another occlusion trace in the reverse direction we fix this. Any backfaces we passed through in
// the initial trace become frontfaces to be occluded by.
if (hitResult && !TraceOcclusion(_scene, hitResult.Position + hitResult.ErrorOffset * hitResult.Normal, origin))
{
return _triangleTypeMap[(int)hitResult.PrimId] == SurfaceType.Sky;
}