private Color3 SampleLightDirectly(ISurfaceLight light, Color3 brdf, Intersection intersection) { var rPoint = light.GetRandomPoint(_rng, intersection); //get random point on light var l = rPoint.Location - intersection.Location; //vector to light var dist = l.LengthFast; l.Normalize(); var lightRay = Ray.CreateFromIntersection(intersection, l, dist); //ray to light var nlightDotL = Vector3.Dot(rPoint.Normal, -l); //light normal dot light var nDotL = Vector3.Dot(intersection.SurfaceNormal, l); //normal dot light if (nDotL > 0 && nlightDotL > 0 && !IntersectionHelper.DoesIntersect(lightRay, _scene.Objects, light)) { var solidAngle = (nlightDotL * light.Area) / (dist * dist); //light area on hemisphere return(light.Color * solidAngle * brdf * nDotL); } return(Color4.Black); }
private Color3 SampleLightDirectly(ISurfaceLight light, Color3 brdf, Intersection intersection) { var rPoint = light.GetRandomPoint(_rng, intersection); //get random point on light var l = rPoint.Location - intersection.Location; //vector to light var dist = l.LengthFast; l.Normalize(); var lightRay = Ray.CreateFromIntersection(intersection, l, dist); //ray to light var nlightDotL = Vector3.Dot(rPoint.Normal, -l); //light normal dot light var nDotL = Vector3.Dot(intersection.SurfaceNormal, l); //normal dot light if (nDotL > 0 && nlightDotL > 0 && !IntersectionHelper.DoesIntersect(lightRay, _scene.Objects, light)) { var solidAngle = (nlightDotL * light.Area) / (dist * dist); //light area on hemisphere return light.Color * solidAngle * brdf * nDotL; } return Color4.Black; }