multisampling/
multisampling.rs

1use rayimg::{*, math::*, shapes::*, materials::*};
2use std::rc::Rc;
3
4fn main() {
5    let mut scene = Scene::new();
6    let blue_sphere = Sphere::new(Vec3::new(0.0, 0.0, -1.0), 0.5, Rc::new(Lambertian::new(RGB(0.0, 0.0, 1.0))));
7    let grey_sphere = Sphere::new(Vec3::new(0.0, -100.5, -1.0), 100.0, Rc::new(Lambertian::new(RGB(0.5, 0.5, 0.5))));
8
9    scene.add_object(blue_sphere);
10    scene.add_object(grey_sphere);
11
12
13
14    let args = std::env::args().skip(1).collect::<Vec<String>>();
15    let mut sample_counts = user_sample_counts(&args);
16    if !args.contains(&"--only".into()) {
17        sample_counts.extend_from_slice(&[1, 100, 1000]);        
18    }
19
20    for sample_count in sample_counts {
21        let renderer = Renderer::new(scene.clone(), Camera::default())
22            .ray_miss(|r| {
23                let unit_direction = r.direction().normalize();
24                let t = 0.5 * (unit_direction.y + 1.0);
25                (Vec3::new(1.0, 1.0, 1.0) * (1.0 - t) + Vec3::new(0.5, 0.7, 1.0) * t).into()
26            })
27            .sample_count(sample_count)
28            .build();
29
30        renderer.render(P3ImageWriter::new((400, 225), std::fs::File::create(format!("examples/output/multisampling/{}_sample_per_pixel.ppm", sample_count)).expect("Failed to create output file")));
31    }
32}
33
34fn user_sample_counts(args: &[String]) -> Vec<usize> {
35    let mut sample_counts = Vec::new();
36    for arg in args {
37        match arg.parse::<usize>() {
38            Ok(sample_count) if sample_count > 0 => sample_counts.push(sample_count),
39            _ => ()
40        };
41    }
42
43    sample_counts
44}