This commit is contained in:
Jonathan Flueren 2022-09-20 16:18:50 +02:00
commit e3cb37817c
3 changed files with 38 additions and 21 deletions

View file

@ -1,7 +1,4 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib viking_room.mtl
o mesh_all1_Texture1_0
v -0.573651 0.001530 0.713748 v -0.573651 0.001530 0.713748
v -0.573651 0.151382 -0.000154 v -0.573651 0.151382 -0.000154
v -0.573651 0.164474 0.619081 v -0.573651 0.164474 0.619081

View file

@ -67,17 +67,17 @@ fn main() {
// Image // Image
let aspect_ratio = 10.0 / 7.5; //16.0 / 9.0; let aspect_ratio = 10.0 / 7.5; //16.0 / 9.0;
let image_width = 400; let image_width = 600;
let image_height = (image_width as f64 / aspect_ratio) as u32; let image_height = (image_width as f64 / aspect_ratio) as u32;
let samples_per_pixel = 50_u32; let samples_per_pixel = 50_u32;
let max_depth = 50; let max_depth = 50;
let antialiasing_threshold = 0.2; // at what diff between two colors will a pixel be antialiased let antialiasing_threshold = 0.2; // at what diff between two colors will a pixel be antialiased
let vfov = 40.0; let vfov = 43.0;
let lookfrom = Point3::new(2.0, 0.8, 3.0); let lookfrom = Point3::new(2.0, 1.0, 1.0);
let lookat = Point3::new(0.0, 0.0, 0.0); let lookat = Point3::new(0.0, 0.2, 0.0);
let vup = Vec3::new(0.0, 1.0, 0.0); let vup = Vec3::new(0.0, 1.0, 0.0);
let dist_to_focus = 3.0; let dist_to_focus = 1.0;
let aperture = 0.0; // disable depth of field let aperture = 0.0; // disable depth of field
// limit rayon multithreading thread count // limit rayon multithreading thread count
@ -88,7 +88,7 @@ fn main() {
// World // World
eprintln!("[1/4] Loading meshes from file..."); eprintln!("[1/4] Loading meshes from file...");
let world = from_obj("obj/suzanne.obj"); let world = from_obj("obj/viking_room.obj");
// let world = random_world(); // let world = random_world();
// Camera // Camera
@ -137,6 +137,26 @@ fn main() {
.collect(); .collect();
bar.finish_and_clear(); bar.finish_and_clear();
// no antialiasing
if samples_per_pixel == 1_u32 {
eprintln!("[4/4] Exporting image to disk...");
(0..image_height).into_iter().rev().for_each(|j| {
(0..image_width).into_iter().for_each(|i| {
color::put_color(
&mut image,
&color_lines[(image_height - j - 1) as usize][i as usize],
i,
image_height - j - 1,
1,
);
})
});
image.save(default_file).unwrap();
return;
}
eprintln!("[3/4] Antialiasing image..."); eprintln!("[3/4] Antialiasing image...");
let mut antialiasing: Vec<Vec<bool>> = Vec::new(); let mut antialiasing: Vec<Vec<bool>> = Vec::new();
let mut antialiasing_counter = 0; let mut antialiasing_counter = 0;
@ -261,13 +281,13 @@ fn from_obj(path: &str) -> HittableList {
))); )));
*/ */
let material = Arc::new(Lambertian::new(&Color::new( //let material = Arc::new(Lambertian::new(&Color::new(
77.0 / 255.0, // 77.0 / 255.0,
77.0 / 255.0, // 77.0 / 255.0,
118.0 / 255.0, // 118.0 / 255.0,
))); //)));
//let material = Arc::new(Dielectric::new(2.0)); //let material = Arc::new(Dielectric::new(2.0));
//let material = Arc::new(Metal::new(&Color::new(0.9, 0.9, 0.7), 1.0)); let material = Arc::new(Metal::new(&Color::new(0.7, 0.7, 0.8), 0.0));
//let material = Arc::new(Rainbow::new()); //let material = Arc::new(Rainbow::new());
let cornell_box = tobj::load_obj(path, &tobj::OFFLINE_RENDERING_LOAD_OPTIONS); let cornell_box = tobj::load_obj(path, &tobj::OFFLINE_RENDERING_LOAD_OPTIONS);
@ -336,18 +356,18 @@ fn from_obj(path: &str) -> HittableList {
world.add(Box::<Triangle>::new(Triangle::new( world.add(Box::<Triangle>::new(Triangle::new(
Point3::new( Point3::new(
mesh.positions[3 * index_a] as f64, mesh.positions[3 * index_a] as f64,
mesh.positions[3 * index_a + 1] as f64,
mesh.positions[3 * index_a + 2] as f64, mesh.positions[3 * index_a + 2] as f64,
mesh.positions[3 * index_a + 1] as f64,
), ),
Point3::new( Point3::new(
mesh.positions[3 * index_b] as f64, mesh.positions[3 * index_b] as f64,
mesh.positions[3 * index_b + 1] as f64,
mesh.positions[3 * index_b + 2] as f64, mesh.positions[3 * index_b + 2] as f64,
mesh.positions[3 * index_b + 1] as f64,
), ),
Point3::new( Point3::new(
mesh.positions[3 * index_c] as f64, mesh.positions[3 * index_c] as f64,
mesh.positions[3 * index_c + 1] as f64,
mesh.positions[3 * index_c + 2] as f64, mesh.positions[3 * index_c + 2] as f64,
mesh.positions[3 * index_c + 1] as f64,
), ),
normal_avg, normal_avg,
material.clone(), material.clone(),

View file

@ -77,7 +77,7 @@ impl Material for Metal {
*scattered = Ray::new(rec.p, reflected + self.fuzz * Vec3::random_in_unit_sphere()); *scattered = Ray::new(rec.p, reflected + self.fuzz * Vec3::random_in_unit_sphere());
*attenuation = self.albedo.clone(); *attenuation = self.albedo.clone();
return Vec3::dot(scattered.direction(), rec.normal) > 0.0; return true;//Vec3::dot(scattered.direction(), rec.normal) > 0.0;
} }
} }
@ -97,7 +97,7 @@ impl Material for Mirror {
) -> bool { ) -> bool {
if utility::random_f64() > 0.8 { if utility::random_f64() > 0.8 {
// Reflektiert // Reflektiert
let reflected = Vec3::reflect(&Vec3::unit_vector(r_in.direction()), &rec.normal); let reflected = Vec3::reflect(&r_in.direction(), &rec.normal);
*scattered = Ray::new(rec.p, reflected); *scattered = Ray::new(rec.p, reflected);
*attenuation = self.albedo.clone(); *attenuation = self.albedo.clone();