Tracer
material.h
1 #ifndef material_h
2 #define material_h
3 
4 struct hit_record;
5 
6 #include "hittable.h"
7 #include "ray.h"
8 #include "vec3.h"
9 
10 
11 class material{
12  public:
13  __device__ virtual bool scatter(const ray &r_in,const hit_record& rec, vec3 &att, ray &scat, curandState* local_rand_state) const=0;
14 };
15 
16 class lambertian : public material{
17  public:
18  vec3 albedo;
19  __device__ lambertian(const vec3& a) {
20  albedo=a;
21  }
22  __device__ virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& att, ray& scat, curandState* local_rand_state) const {
23  vec3 rand_V=(rec.n+rec.p+random_unit_sphere(local_rand_state));
24  scat = ray(rec.p,(rand_V-rec.p));
25  att=albedo;
26  return true;
27  }
28 };
29 
30 class metal : public material{
31  public:
32  vec3 albedo;
33  float fuzz;
34  __device__ metal(){}
35  __device__ metal(const vec3 &a, float f) {
36  albedo=a;
37  if (f < 1.0f) {
38  fuzz = f;
39  } else {
40  fuzz = 1.0f;
41  }
42  }
43  __device__ virtual bool scatter(const ray &r_in,const hit_record& rec,vec3& att, ray& scat, curandState* local_rand_state) const {
44  vec3 ref = reflect(r_in.direction.normalize(),rec.n);
45  scat = ray(rec.p, ref + random_unit_sphere(local_rand_state) * fuzz);
46  att = albedo;
47  return rec.n.dot(scat.direction) > 0.0f;
48  }
49 };
50 
51 
52 class dielectric : public material {
53  public:
54  float idx;
55  __device__ dielectric(float id) {
56  idx = id;
57  }
58  __device__ virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& att, ray& scat, curandState* local_rand_state) const {
59  vec3 norm_out;
60  vec3 refracted;
61  att = vec3(1.0, 1.0, 1.0);
62  vec3 reflected = reflect(r_in.direction, rec.n);
63  float ni_nt;
64  float cos;
65  float prob_ref;
66  if (r_in.direction.dot(rec.n) > 0.0f) {
67  norm_out = rec.n * -1.0f;
68  ni_nt = idx;
69  cos = (idx * ((r_in.direction.dot(rec.n)) / (r_in.direction.magnitude())));
70  }
71  else {
72  norm_out = rec.n;
73  ni_nt = 1.0f / idx;
74  cos = (((r_in.direction.dot(rec.n)) / (r_in.direction.magnitude())) * -1.0f);
75  }
76 
77  if (refraction(r_in.direction, norm_out, ni_nt, refracted)) {
78  prob_ref = schlick(cos, idx);
79  }
80  else {
81  prob_ref = 1.0f;
82  }
83 
84  if (curand_uniform(local_rand_state) < prob_ref) {
85  scat = ray(rec.p, reflected);
86  }
87  else {
88  scat = ray(rec.p, refracted);
89  }
90 
91  return true;
92  }
93 };
94 
95 
96 #endif
Definition: material.h:30
Definition: vec3.h:10
Definition: ray.h:4
Definition: material.h:52
Definition: material.h:11
Definition: material.h:16
Definition: hittable.h:8