@@ -145,22 +145,21 @@ struct Scatter {
145
145
ray : Ray ,
146
146
}
147
147
148
- fn sample_perfectly_specular (input_dir : vec3f , normal : vec3f ) -> vec3f {
149
- return reflect (input_dir , normal );
150
- }
151
-
152
148
fn sample_lambertian (input_dir : vec3f , normal : vec3f ) -> vec3f {
153
149
return normal + sample_sphere () * (1 . - EPSILON );
154
150
}
155
151
156
152
fn scatter (input_ray : Ray , hit : Intersection , material : Material ) -> Scatter {
157
- var reflected : vec3f ;
158
- if material . specular == 1 {
159
- reflected = sample_perfectly_specular (input_ray . direction, hit . normal);
153
+ var scattered : vec3f ;
154
+ if material . specular_or_ior > 0 . {
155
+ scattered = reflect (input_ray . direction, hit . normal);
156
+ } else if material . specular_or_ior < 0 . {
157
+ let ior = abs (material . specular_or_ior);
158
+ scattered = refract (input_ray . direction, hit . normal, ior );
160
159
} else {
161
- reflected = sample_lambertian (input_ray . direction, hit . normal);
160
+ scattered = sample_lambertian (input_ray . direction, hit . normal);
162
161
}
163
- let output_ray = Ray (point_on_ray (input_ray , hit . t), reflected );
162
+ let output_ray = Ray (point_on_ray (input_ray , hit . t), scattered );
164
163
let attenuation = material . color;
165
164
return Scatter (attenuation , output_ray );
166
165
}
@@ -176,27 +175,31 @@ fn point_on_ray(ray: Ray, t: f32) -> vec3<f32> {
176
175
177
176
struct Material {
178
177
color : vec3f ,
179
- specular : u32 ,
178
+ specular_or_ior : f32 ,
180
179
}
181
180
182
181
fn sky_color (ray : Ray ) -> vec3f {
183
182
let t = 0.5 * (normalize (ray . direction). y + 1 . );
184
183
return (1 . - t ) * vec3 (1 . ) + t * vec3 (0.3 , 0.5 , 1 . );
185
184
}
186
185
187
- const OBJECT_COUNT: u32 = 3 ;
186
+ const OBJECT_COUNT: u32 = 4 ;
188
187
alias Scene = array <Sphere , OBJECT_COUNT>;
189
188
alias Materials = array <Material , OBJECT_COUNT>;
190
189
191
190
var <private > materials : Materials = Materials (
192
- Material (/ *color */ vec3 (0.7 , 0.5 , 0.5 ), / *specular */ 1 ),
193
- Material (/ *color */ vec3 (0.5 , 0.5 , 0.9 ), / *specular */ 0 ),
194
- Material (/ *color */ vec3 (0.7 , 0.9 , 0.2 ), / *specular */ 0 ),
191
+ Material (/ *color */ vec3 (0.7 , 0.5 , 0.5 ), / *specular_or_ior */ 1 . ),
192
+ Material (/ *color */ vec3 (0.5 , 0.5 , 0.9 ), / *specular_or_ior */ 0 . ),
193
+ Material (/ *color */ vec3 (0.7 , 0.9 , 0.2 ), / *specular_or_ior */ 0 . ),
194
+ Material (/ *color */ vec3 (1 . ), / *specular_or_ior */- 1.5 ),
195
195
);
196
196
197
197
var <private > scene : Scene = Scene (
198
- Sphere (/ *center */ vec3 (- 0.6 , 0.5 , 0 . ), / *radius */ 0.5 , / *material_index */ 0 ),
199
- Sphere (/ *center */ vec3 (0.6 , 0.5 , 0 . ), / *radius */ 0.5 , / *material_index */ 1 ),
198
+ Sphere (/ *center */ vec3 (- 1.1 , 0.5 , 0 . ), / *radius */ 0.5 , / *material_index */ 0 ),
199
+ Sphere (/ *center */ vec3 (0 . , 0.5 , 0 . ), / *radius */ 0.5 , / *material_index */ 1 ),
200
+ Sphere (/ *center */ vec3 (1.1 , 0.5 , 0 . ), / *radius */ 0.5 , / *material_index */ 3 ),
201
+
202
+ // Ground
200
203
Sphere (/ *center */ vec3 (0 . , - 2e2 - EPSILON , 0 . ), / *radius */ 2e2 , / *material_index */ 2 ),
201
204
);
202
205
0 commit comments