virtual bool scatter(Ray<float> & r_in, hit_record & rec, Vec3<float> & attenuation, Ray<float> & scattered) const{ Vec3<float> target = rec.p + rec.normal + random_in_unit_sphere(); scattered = Ray<float>(rec.p, target - rec.p); attenuation = albedo; return true; }
bool Metal::scatter(const Ray& r_in, const HitRecord& record, vec3& attenuation, Ray& scattered) const { vec3 reflected = reflect( glm::normalize(r_in.direction()), record.normal ); scattered = Ray(record.point, reflected + roughness * random_in_unit_sphere()); attenuation = albedo; return (dot(scattered.direction(), record.normal) > 0); }
bool Lambertian::scatter(const Ray& r_in, const HitRecord& record, vec3& attenuation, Ray& scattered) const { vec3 target = record.point + record.normal + random_in_unit_sphere(); scattered = Ray(record.point, target - record.point); attenuation = albedo; return true; }
t_bool lambertian(t_material *material, const t_ray *r, const t_hit_record *h, t_vec3 *attenuation, t_ray *scattered) { (void)r; t_vec3 target; t_vec3 random; random = random_in_unit_sphere(1.0f); vec3_add(&target, vec3_add(&target, &h->normal, &h->pos), &random); ray_assign(scattered, &h->pos, vec3_sub(&target, &target, &h->pos)); material->texture.value(&material->texture, h, attenuation); return (TRUE); }
bool Lambertian::scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const { vec3 target = rec.p + rec.normal + random_in_unit_sphere(); scattered = ray(rec.p, target - rec.p); attenuation = albedo; return true; }