public static Color ShadeHit(World w, Computation comps, int remaining = 5) { var surface = Color.Black; foreach (var Light in w.Lights) { var shadowed = Light.IsShadowed(w, comps.OverPoint); surface += Light.Lighting( comps.Object.Material, comps.Object, Light, comps.Point, comps.EyeV, comps.NormalV, shadowed); } var reflected = w.ReflectedColor(comps, remaining); var refracted = w.RefractedColor(comps, remaining); var material = comps.Object.Material; if (material.Reflective > 0 && material.Transparency > 0) { var reflectance = comps.Schlick(); return(surface + reflected * reflectance + refracted * (1 - reflectance)); } else { return(surface + reflected + refracted); } }
public void LightingWithPatternApplied() { var m = new RTF.Material { Pattern = Pattern.GetStripePattern(RTF.Color.White, RTF.Color.Black), Ambient = 1, Diffuse = 0, Specular = 0 }; var eyev = pt.Vector(0, 0, -1); var normalv = pt.Vector(0, 0, -1); var light = new RTF.Light(pt.Point(0, 0, -10), RTF.Color.White); var c1 = light.Lighting(m, new shapes.Sphere(), pt.Point(0.9, 0, 0), eyev, normalv, false); var c2 = light.Lighting(m, new shapes.Sphere(), pt.Point(1.1, 0, 0), eyev, normalv, false); Assert.Equal(RTF.Color.White, c1); Assert.Equal(RTF.Color.Black, c2); }
public void LightingWithEyeBehindSurface() { var m = new RTF.Material(); var position = pt.Point(0, 0, 0); var eyeVector = pt.Vector(0, 0, -1); var normalVector = pt.Vector(0, 0, -1); var light = new RTF.Light (pt.Point(0, 0, 10), new RTF.Color(1, 1, 1)); var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false); Assert.Equal(new RTF.Color(0.1, 0.1, 0.1), result); }
public void LightingWithEyePathReflection() { var m = new RTF.Material(); var position = pt.Point(0, 0, 0); var eyeVector = pt.Vector(0, -Math.Sqrt(2) / 2, -Math.Sqrt(2) / 2); var normalVector = pt.Vector(0, 0, -1); var light = new RTF.Light (pt.Point(0, 10, -10), new RTF.Color(1, 1, 1)); var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false); CustomAssert.Equal(new RTF.Color(1.6364, 1.6364, 1.6364), result, 4); }
public void LightingWithEyeOppositeSurfaceOffset45() { var m = new RTF.Material(); var position = pt.Point(0, 0, 0); var eyeVector = pt.Vector(0, 0, -1); var normalVector = pt.Vector(0, 0, -1); var light = new RTF.Light (pt.Point(0, 10, -10), new RTF.Color(1, 1, 1)); var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false); CustomAssert.Equal(new RTF.Color(0.7364, 0.7364, 0.7364), result, 4); }
public void LightingWithEyeBetweenLightSurfaceOffset45() { var m = new RTF.Material(); var position = pt.Point(0, 0, 0); var eyeVector = pt.Vector(0, Math.Sqrt(2) / 2, -Math.Sqrt(2) / 2); var normalVector = pt.Vector(0, 0, -1); var light = new RTF.Light (pt.Point(0, 0, -10), new RTF.Color(1, 1, 1)); var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false); Assert.Equal(new RTF.Color(1, 1, 1), result); }
public void LightingSurfaceShadow() { var m = new RTF.Material(); var position = p.Point(0, 0, 0); var eyeV = p.Vector(0, 0, -1); var normalV = p.Vector(0, 0, -1); var light = new RTF.Light(p.Point(0, 0, -10), RTF.Color.White); var inShadow = true; var result = light.Lighting(m, new Sphere(), position, eyeV, normalV, inShadow); var expected = new RTF.Color(0.1, 0.1, 0.1); Assert.Equal(expected, result); }