Lumo

crates.io docs.rs Coverage

Lumo is a CPU based multithreaded rendering engine. Made with the goal of learning Rust and physically based rendering :)

Features

Gallery

Bust of Nefertiti Cornell box Conference room Circle of spheres

Usage

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 in the examples or partially through the CLI:

``` Usage: hello_sphere [-s ] [-t ] [-d] [-b]

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) -d, --direct use direct light integrator instead of path tracing -b, --bdpt use bidirectional path tracing instead of path tracing --help display usage information ```

API example

The hello_sphere.rs example is written as follows:

```rust use lumo::tracer::; use lumo::;

fn main() -> Result<(), png::EncodingError> { let camera = Camera::default(1280, 720); let mut scene = Scene::default();

scene.add(Plane::new(
    Vec3::NEG_Y,
    Vec3::Y,
    Material::diffuse(Texture::Solid(Color::new(190, 200, 210))),
));

scene.add_light(Sphere::new(
    8.0 * Vec3::Y + 1.5 * Vec3::NEG_Z,
    4.0,
    Material::Light(Texture::Solid(Color::WHITE)),
));

scene.add(
    Sphere::new(
        Vec3::ZERO,
        1.0,
        Material::diffuse(Texture::Solid(Color::new(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")

} ```

References