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