예제 #1
0
        public bool Scatter(Ray ray, HitInfo hit, out Vec3 attenuation, out Ray scattered)
        {
            attenuation = albedo;

            double nu;
            double cosine;
            Vec3   norm;
            Vec3   reflected = Vec3.Reflect(ray.Direction, hit.normal);

            double reflect_prob;

            if (Vec3.Dot(hit.normal, ray.Direction) > 0)
            {
                norm   = -hit.normal;
                nu     = ri;
                cosine = ri * Vec3.Dot(ray.Direction, hit.normal) / ray.Direction.Length;
            }
            else
            {
                norm   = hit.normal;
                nu     = 1.0 / ri;
                cosine = -Vec3.Dot(ray.Direction, hit.normal) / ray.Direction.Length;
            }

            reflect_prob = Refract(ray.Direction, norm, nu, out Vec3 refracted) ? SchlickReflectivity(cosine) : 1.0;

            scattered.A = hit.hitpoint;
            scattered.B = reflect_prob > rng.NextDouble() ? reflected : refracted;
            return(true);
        }
예제 #2
0
        public bool Scatter(Ray ray, HitInfo hit, out Vec3 attenuation, out Ray scattered)
        {
            Vec3 target_dir = Vec3.Reflect(ray.Direction, hit.normal) + rng.GetRandomPointInUnitSphere() * fuzziness;

            scattered.A = hit.hitpoint;
            scattered.B = target_dir;
            attenuation = albedo;
            return(Vec3.Dot(scattered.Direction, hit.normal) > 0);
        }