Lumo is a CPU based multithreaded rendering engine. Made with the goal of learning Rust and physically based rendering :) The renderer is designed to be as modular as possible such that adding new features or algorithms is straightforward.
Once the repository is cloned, the examples/
folder contains scenes. To run the hello_sphere.rs
example execute the command:
bash
cargo run --example hello_sphere
The renderer can be configured either through its setter methods or partially through the CLI:
```
Usage: hello_sphere [-s
Optional CLI configuration of renderer. Renderer setter methods have priority.
Options: -s, --samples number of samples per pixel (defaults to 1) -t, --threads number of threads used (defaults to all) -w, --width width of the rendered image (defaults to 1000) -h, --height height of the rendered image (defaults to 1000) -d, --direct use direct light integrator instead of path tracing. --help display usage information ```
The hello_sphere.rs
example is written as follows:
```rust use glam::DVec3; use lumo::tracer::; use lumo::;
fn main() -> Result<(), png::EncodingError> { let camera = Camera::default(); let mut scene = Scene::default();
scene.add(Plane::new(
DVec3::NEG_Y,
DVec3::Y,
Material::diffuse(Texture::Solid(srgb_to_linear(190, 200, 210))),
));
scene.add_light(Sphere::new(
8.0 * DVec3::Y + 1.5 * DVec3::NEG_Z,
4.0,
Material::Light(Texture::Solid(srgb_to_linear(255, 255, 255))),
));
scene.add(
Sphere::new(
DVec3::ZERO,
1.0,
Material::diffuse(Texture::Solid(srgb_to_linear(0, 0, 255))),
)
.scale(0.3, 0.3, 0.3)
.translate(0.0, -0.7, -1.5),
);
let mut renderer = Renderer::new(scene, camera);
renderer.set_samples(36);
renderer.render().save("hello.png")
} ```