コード例 #1
0
        public override bool Scatter(Scene scene, Ray ray, HitRecord rec, out Attenuation attenuation, out Ray scattered)
        {
            Vector3 outward_normal;
            float   ni_over_nt;

            attenuation = Attenuation.Multiply(Vector3.One);
            float reflect_prob;
            float cosine;

            if (Vector3.Dot(ray.direction, rec.normal) > 0)//内部射出
            {
                outward_normal = -rec.normal;
                ni_over_nt     = refIndex;
                cosine         = refIndex * Vector3.Dot(ray.direction, rec.normal) / ray.direction.Length();
            }
            else //外部射入
            {
                outward_normal = rec.normal;
                ni_over_nt     = 1.0f / refIndex;
                //ni_over_nt = this.ri_out / this.ri_in;
                cosine = -Vector3.Dot(ray.direction, rec.normal) / ray.direction.Length();
            }

            if (Refract(ref ray.direction, ref outward_normal, ni_over_nt, out Vector3 refracted))
            {
                reflect_prob = Schlick(cosine, refIndex);
            }
コード例 #2
0
        public override bool Scatter(Scene scene, Ray ray, HitRecord hit, out Attenuation attenuation, out Ray scattered)
        {
            Vector3 target = hit.position + hit.normal + Sphere.RandomInUnitSphere();

            scattered   = new Ray(hit.position, target - hit.position);
            attenuation = Attenuation.Multiply(albedo);

            return(true);
        }
コード例 #3
0
        public override bool Scatter(Scene scene, Ray ray, HitRecord hit, out Attenuation attenuation, out Ray scattered)
        {
            var     direction = Vector3.Normalize(ray.direction);
            Vector3 reflected = Vector3.Reflect(direction, hit.normal);

            scattered   = new Ray(hit.position, reflected + fuzz * Sphere.RandomInUnitSphere());
            attenuation = Attenuation.Multiply(albedo);

            //return true;
            return(Vector3.Dot(scattered.direction, hit.normal) > 0);
        }