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