Exemplo n.º 1
0
        public bool Scatter(Ray rIn, HitRecord record, Vector3 attenuation, Ray scattered, Random rand)
        {
            Vector3 reflected = Vector3.Reflect(rIn.Direction.Normalize(), record.Normal);

            // Save scattered & attenuation values
            scattered.Set(new Ray(record.Point, reflected + Fuzz * Vector3.RandomInUnitSphere(rand)));
            attenuation.Set(Albedo);

            return(scattered.Direction.Dot(record.Normal) > 0);
        }
Exemplo n.º 2
0
        public bool Scatter(Ray rIn, HitRecord record, Vector3 attenuation, Ray scattered, Random rand)
        {
            Vector3 scatterDirection = record.Normal + Vector3.RandomUnitVector(rand);

            // Catch degenerate scatter direction
            if (scatterDirection.NearZero())
            {
                scatterDirection = record.Normal;
            }

            scattered.Set(new Ray(record.Point, scatterDirection));
            attenuation.Set(Albedo);
            return(true);
        }
Exemplo n.º 3
0
        public bool Scatter(Ray rIn, HitRecord record, Vector3 attenuation, Ray scattered, Random rand)
        {
            attenuation.Set(new Vector3(1.0, 1.0, 1.0));
            double refractionRatio = record.FrontFace ? (1.0 / RefractionIndex) : RefractionIndex;

            Vector3 unitDirection = rIn.Direction.Normalize();
            double  cosTheta      = Math.Min(record.Normal.Dot(-unitDirection), 1.0);
            double  sinTheta      = Math.Sqrt(1.0 - cosTheta * cosTheta);

            bool    cannotRefract = refractionRatio * sinTheta > 1.0;
            Vector3 direction;

            if (cannotRefract || reflectance(cosTheta, refractionRatio) > rand.NextDouble())
            {
                direction = Vector3.Reflect(unitDirection, record.Normal);
            }
            else
            {
                direction = Vector3.Refract(unitDirection, record.Normal, refractionRatio);
            }

            scattered.Set(new Ray(record.Point, direction));
            return(true);
        }