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); }
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); }
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); }