Fix #19: Verify sun traces with a reverse occlusion trace
This commit is contained in:
parent
8864993463
commit
651243d91f
|
@ -1068,16 +1068,17 @@ public class LightMapper
|
||||||
// TODO: direction should already be normalised here
|
// TODO: direction should already be normalised here
|
||||||
private bool TraceSunRay(Vector3 origin, Vector3 direction)
|
private bool TraceSunRay(Vector3 origin, Vector3 direction)
|
||||||
{
|
{
|
||||||
// Avoid self intersection
|
|
||||||
origin += direction * MathUtils.Epsilon;
|
|
||||||
|
|
||||||
var hitResult = _scene.Trace(new Ray
|
var hitResult = _scene.Trace(new Ray
|
||||||
{
|
{
|
||||||
Origin = origin,
|
Origin = origin,
|
||||||
Direction = Vector3.Normalize(direction),
|
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;
|
return _triangleTypeMap[(int)hitResult.PrimId] == SurfaceType.Sky;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue