예제 #1
0
        public void ColorWhenRayHits()
        {
            var w = World.Default();
            var r = new Ray(new Point(0, 0, -5), new Vector(0, 0, 1));
            var c = PhongShading.ColorAt(w, r);

            c.Should().Be(new Color(0.38066f, 0.47583f, 0.2855f));
        }
예제 #2
0
        public void ColorWhenRayMissesIsBlack()
        {
            var w = World.Default();
            var r = new Ray(new Point(0, 0, -5), new Vector(0, 1, 0));
            var c = PhongShading.ColorAt(w, r);

            c.Should().Be(new Color(0, 0, 0));
        }
예제 #3
0
        public void ColorWithIntersectionBehind()
        {
            var w = World.Default();

            w.Objects[0].Material.Ambient = 1f;
            w.Objects[1].Material.Ambient = 1f;
            var r = new Ray(new Point(0, 0, 0.75f), new Vector(0, 0, -1));
            var c = PhongShading.ColorAt(w, r);

            c.Should().Be(w.Objects[1].Material.Texture.LocalColorAt(Point.Zero));
        }
예제 #4
0
        public void HandleParallelReflectiveSurfaces()
        {
            var w = new World();

            w.SetLights(new PointLight(new Point(0, 0, 0), Colors.White));
            var lower = new Plane {
                Material = { Reflective = 1f }
            };

            lower.SetTransform(Transform.Translate(0, -1, 0));

            var upper = new Plane {
                Material = { Reflective = 1f }
            };

            upper.SetTransform(Transform.Translate(0, 1, 0));

            w.SetObjects(lower, upper);
            var r = new Ray(new Point(0, 0, 0), new Vector(0, 1, 0));

            // Test to ensure an infinite loop is not hit.
            PhongShading.ColorAt(w, r).Should().NotBe(new Color(1, 0, 0));
        }