Draw first image

This commit is contained in:
hal8174 2024-09-28 20:15:05 +02:00
parent 4c872f9f91
commit 62b9fdcb56
19 changed files with 1566 additions and 76 deletions

View file

@ -0,0 +1,11 @@
[package]
name = "ray-tracing-image"
version = "0.1.0"
edition = "2021"
[dependencies]
image = "0.25.2"
rand = { version = "0.8.5", features = ["small_rng"] }
ray-tracing-core = { path = "../ray-tracing-core" }
ray-tracing-scene = { path = "../ray-tracing-scene" }
rayon = "1.10.0"

View file

@ -0,0 +1,52 @@
use image::{ImageBuffer, ImageResult, Rgb};
use rand::{rngs::SmallRng, SeedableRng};
use ray_tracing_core::{
camera::BasicCamera,
prelude::*,
renderer::{ClassicalRenderer, DepthRenderer},
};
use ray_tracing_scene::BasicScene;
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 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 = DepthRenderer::new(s, c);
render_image(r, "test.exr", 16)
}