Implement sub-sampling anti-aliasing.

Move camera to code to separate module.
This commit is contained in:
2018-09-09 13:36:33 -07:00
parent 35722b57b1
commit 9698afce43
5 changed files with 164 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
extern crate rand;
extern crate rtiow;
use rand::Rng;
use rtiow::camera::Camera;
use rtiow::hitable::Hit;
use rtiow::hitable_list::HitableList;
use rtiow::ray::Ray;
use rtiow::sphere::Sphere;
use rtiow::vec3::Vec3;
fn color(r: Ray, world: &Hit) -> Vec3 {
if let Some(rec) = world.hit(r, 0., std::f32::MAX) {
return (rec.normal + 1.) * 0.5;
}
// No hit, choose color from background.
let unit_direction = r.direction().unit_vector();
let t = 0.5 * (unit_direction.y + 1.);
Vec3::new(1., 1., 1.) * (1. - t) + Vec3::new(0.5, 0.7, 1.) * t
}
fn main() -> Result<(), std::io::Error> {
let mut rng = rand::thread_rng();
let nx = 200;
let ny = 100;
let ns = 100;
println!("P3\n{} {}\n255", nx, ny);
let objects = vec![
Sphere::new(Vec3::new(0., 0., -1.), 0.5),
Sphere::new(Vec3::new(0., -100.5, -1.), 100.),
];
let cam = Camera::new2x1();
let world = HitableList::new(objects.iter().map(|o| o).collect());
for j in (0..ny).rev() {
for i in 0..nx {
let mut col: Vec3 = Default::default();
for _ in 0..ns {
let u = (rng.gen_range::<f32>(0., 1.) + i as f32) / nx as f32;
let v = (rng.gen_range::<f32>(0., 1.) + j as f32) / ny as f32;
let r = cam.get_ray(u, v);
col = col + color(r, &world);
}
col = col / ns as f32;
let ir = (255.99 * col[0]) as u32;
let ig = (255.99 * col[1]) as u32;
let ib = (255.99 * col[2]) as u32;
println!("{} {} {}", ir, ig, ib);
}
}
Ok(())
}

27
rtiow/src/camera.rs Normal file
View File

@@ -0,0 +1,27 @@
use ray::Ray;
use vec3::Vec3;
pub struct Camera {
origin: Vec3,
lower_left_corner: Vec3,
horizontal: Vec3,
vertical: Vec3,
}
impl Camera {
pub fn new2x1() -> Camera {
Camera {
lower_left_corner: Vec3::new(-2., -1., -1.),
horizontal: Vec3::new(4., 0., 0.),
vertical: Vec3::new(0., 2., 0.),
origin: Default::default(),
}
}
pub fn get_ray(&self, u: f32, v: f32) -> Ray {
Ray::new(
self.origin,
self.lower_left_corner + self.horizontal * u + self.vertical * v - self.origin,
)
}
}

View File

@@ -1,3 +1,4 @@
pub mod camera;
pub mod hitable;
pub mod hitable_list;
pub mod ray;