public override bool Scatter(RTRay ray, HitRecord hit, out Color attenuation, out RTRay scattered) { Vector3 reflected = RTMath.Reflect(ray.direction.normalized, hit.n); scattered = new RTRay().Set(hit.p, reflected + fuzz * RTMath.RndInUnitSphere()); attenuation = albedo; return(Vector3.Dot(scattered.direction, hit.n) > 0); }
public override bool Scatter(RTRay ray, HitRecord hit, out Color attenuation, out RTRay scattered) { attenuation = new Color(1, 1, 1); Vector3 outwardN; float ni_over_nt; Vector3 refracted; float reflect_prob; float cosine; if (Vector3.Dot(ray.direction, hit.n) > 0) { outwardN = -hit.n; ni_over_nt = refractiveIndex; cosine = Vector3.Dot(ray.direction, hit.n) / ray.direction.magnitude; } else { outwardN = hit.n; ni_over_nt = 1.0f / refractiveIndex; cosine = -Vector3.Dot(ray.direction, hit.n) / ray.direction.magnitude; } if (RTMath.Refract(ray.direction, outwardN, ni_over_nt, out refracted)) { reflect_prob = RTMath.schlick(cosine, refractiveIndex); } else { reflect_prob = 1.0f; } if (RTMath.Rnd01() < reflect_prob) { scattered = new RTRay().Set(hit.p, RTMath.Reflect(ray.direction, hit.n)); } else { scattered = new RTRay().Set(hit.p, refracted); } return(true); }