예제 #1
0
        private Color TraceRay(Ray ray, Scene scene, int depth)
        {
            var   isects = Intersections(ray, scene);
            ISect isect  = isects.FirstOrDefault();

            if (isect == null)
            {
                return(Color.Background);
            }
            return(Shade(isect, scene, depth));
        }
예제 #2
0
        private double TestRay(Ray ray, Scene scene)
        {
            var   isects = Intersections(ray, scene);
            ISect isect  = isects.FirstOrDefault();

            if (isect == null)
            {
                return(0);
            }
            return(isect.Dist);
        }
예제 #3
0
        private Color Shade(ISect isect, Scene scene, int depth)
        {
            var   d          = isect.Ray.Dir;
            var   pos        = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start);
            var   normal     = isect.Thing.Normal(pos);
            var   reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal));
            Color ret        = Color.DefaultColor;

            ret = Color.Plus(ret, GetNaturalColor(isect.Thing, pos, normal, reflectDir, scene));
            if (depth >= MaxDepth)
            {
                return(Color.Plus(ret, Color.Make(.5, .5, .5)));
            }
            return(Color.Plus(ret, GetReflectionColor(isect.Thing, Vector.Plus(pos, Vector.Times(.001, reflectDir)), normal, reflectDir, scene, depth)));
        }