Draw first image
This commit is contained in:
parent
4c872f9f91
commit
62b9fdcb56
19 changed files with 1566 additions and 76 deletions
11
ray-tracing-image/Cargo.toml
Normal file
11
ray-tracing-image/Cargo.toml
Normal 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"
|
||||
52
ray-tracing-image/src/main.rs
Normal file
52
ray-tracing-image/src/main.rs
Normal 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)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue