53 lines
1.5 KiB
Rust
53 lines
1.5 KiB
Rust
use image::{ImageBuffer, ImageResult, Rgb};
|
|
use rand::{rngs::SmallRng, SeedableRng};
|
|
use ray_tracing_core::{
|
|
camera::BasicCamera,
|
|
prelude::*,
|
|
renderer::{ClassicalRenderer, DepthRenderer, PathTracer},
|
|
};
|
|
use ray_tracing_scene::{basic_scene::BasicScene, triangle_bvh::examples::cornel};
|
|
use rayon::prelude::*;
|
|
use std::path::Path;
|
|
|
|
fn render_image<C: ClassicalRenderer<SmallRng> + Sync>(
|
|
renderer: C,
|
|
outputfilename: impl AsRef<Path>,
|
|
samples_per_pixel: usize,
|
|
) -> ImageResult<()> {
|
|
let mut data = vec![Color::black(); (renderer.width() * renderer.height()) as usize];
|
|
|
|
data.par_iter_mut().enumerate().for_each(|(i, c)| {
|
|
let x = (i % renderer.width() as usize) as u32;
|
|
let y = (i / renderer.width() as usize) as u32;
|
|
|
|
let mut rng = SmallRng::seed_from_u64((x + y * renderer.width()) as u64);
|
|
for _ in 0..samples_per_pixel {
|
|
*c += renderer.render_pixel(x, y, &mut rng) / (samples_per_pixel as Float);
|
|
}
|
|
});
|
|
|
|
let img = ImageBuffer::from_fn(renderer.width(), renderer.height(), |x, y| {
|
|
let c = data[(x + y * renderer.width()) as usize];
|
|
Rgb::<Float>([c.r(), c.g(), c.b()])
|
|
});
|
|
|
|
img.save(outputfilename)
|
|
}
|
|
|
|
fn main() -> ImageResult<()> {
|
|
// let s = BasicScene::new();
|
|
let s = cornel();
|
|
|
|
let c = BasicCamera::new(
|
|
640,
|
|
400,
|
|
Pos3::new(-10.0, 0.0, 0.0),
|
|
Dir3::new(1.0, 0.0, 0.0),
|
|
Dir3::up(),
|
|
Float::to_radians(90.0),
|
|
);
|
|
|
|
let r = PathTracer::new(s, c);
|
|
|
|
render_image(r, "test.exr", 1024)
|
|
}
|