Crates.io | rustracer |
lib.rs | rustracer |
version | 1.0.4 |
source | src |
created_at | 2022-07-12 05:49:26.404388 |
updated_at | 2024-04-06 09:25:06.988058 |
description | a multi-threaded raytracer in pure rust |
homepage | https://github.com/andros21/rustracer |
repository | https://github.com/andros21/rustracer |
max_upload_size | |
id | 624183 |
size | 430,298 |
x86_64-unknown-linux-gnu
(1)x86_64-unknown-linux-musl
(1) note: glibc version >= 2.35
for users install cargo
stable latest build system (see rust-toolchain.toml
for stable version)
for devels install rustup
that will automatically provision the correct toolchain
For unit tests coverage cargo-tarpaulin
is required as additional component
There is an handy makefile
useful to:
rustdoc
cargo-tarpaulin
Install from binary:
curl -sSf https://andros21.github.io/rustracer/install.sh | bash
(2)
## Install the latest version `gnu` variant in `~/.rustracer/bin`
export PREFIX='~/.rustracer/'
curl -sSf https://andros21.github.io/rustracer/install.sh | bash -s -- gnu
## Install the `0.4.0` version `musl` variant in `~/.rustracer/bin`
export PREFIX='~/.rustracer/'
curl -sSf https://andros21.github.io/rustracer/install.sh | bash -s -- musl 0.4.0
(2) note: will install latest musl release in ~/.local/bin
Install from source code, a template could be:
cargo install rustracer
(3)
## Install the latest version using `Cargo.lock` in `~/.rustracer/bin`
export PREFIX='~/.rustracer/'
cargo install --locked --root $PREFIX rustracer
## Install the `0.4.0` version in `~/.rustracer/bin`
export VER='0.4.0'
export PREFIX='~/.rustracer/'
cargo install --root $PREFIX --version $VER rustracer
(3) note: will install latest release in ~/.cargo/bin
subcommands | description |
---|---|
rustracer-convert | convert an hdr image into ldr image |
rustracer-demo | render a simple demo scene (example purpose) |
rustracer-render | render a scene from file (yaml formatted) |
rustracer-completion | generate shell completion script (hidden) |
a multi-threaded raytracer in pure rust
Usage: rustracer <COMMAND>
Commands:
convert Convert HDR (pfm) image to LDR (ff|png) image
demo Render a demo scene (hard-coded in main)
render Render a scene from file (yaml formatted)
Options:
-h, --help Print help
-V, --version Print version
Convert a pfm file to png:
rustracer convert image.pfm image.png
Convert HDR (pfm) image to LDR (ff|png) image
Usage: rustracer convert [OPTIONS] <HDR> <LDR>
Arguments:
<HDR> Input pfm image
<LDR> Output image [possible formats: ff, png]
Options:
-v, --verbose Print stdout information
-f, --factor <FACTOR> Normalization factor [default: 1.0]
-g, --gamma <GAMMA> Gamma parameter [default: 1.0]
-h, --help Print help (see more with '--help')
-V, --version Print version
Rendering demo scene:
rustracer demo --width 1920 --height 1080 --anti-aliasing 3 demo.png
(4)
demo.png: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~35s
demo scene 360 degree (see makefile
):
make demo.gif
(4)
demo.gif: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~15m
Render a demo scene (hard-coded in main)
Usage: rustracer demo [OPTIONS] <OUTPUT>
Arguments:
<OUTPUT> Output image [possible formats: ff, png]
Options:
-v, --verbose Print stdout information
--output-pfm Output also hdr image
--orthogonal Use orthogonal camera instead of perspective camera
--width <WIDTH> Image width [default: 640]
--height <HEIGHT> Image height [default: 480]
--angle-deg <ANGLE_DEG> View angle (in degrees) [default: 0.0]
-f, --factor <FACTOR> Normalization factor [default: 1.0]
-g, --gamma <GAMMA> Gamma parameter [default: 1.0]
-a, --algorithm <ALGORITHM> Rendering algorithm [default: pathtracer] [possible values: onoff, flat, pathtracer]
-n, --num-of-rays <NUM_OF_RAYS> Number of rays [default: 10]
-m, --max-depth <MAX_DEPTH> Maximum depth [default: 3]
--init-state <INIT_STATE> Initial random seed (positive number) [default: 42]
--init-seq <INIT_SEQ> Identifier of the random sequence (positive number) [default: 54]
--anti-aliasing <ANTI_ALIASING> Anti-aliasing level [default: 1]
-h, --help Print help (see more with '--help')
-V, --version Print version
(4) note: all available threads are used, set RAYON_NUM_THREADS
to override
Rendering demo scene from scene file examples/demo.yml
:
rustracer render --anti-aliasing 3 examples/demo.yml demo.png
(5)
you can use this example scene to learn how to write your custom scene, ready to be rendered!
But let's unleash the power of a scene encoded in data-serialization language such as yaml
Well repetitive scenes could be nightmare to be written, but for these (and more) there is cue
Let's try to render a 3D fractal, a sphere-flake, but without manually write a yaml scene file
we can automatic generate it from examples/flake.cue
cue eval flake.cue -e "flake" -f flake.cue.yml # generate yml from cue
cat flake.cue.yml | sed "s/'//g" > flake.yml # little tweaks
wc -l flake.cue flake.yml # compare lines number
92 flake.cue # .
2750 flake.yml # .
so with this trick we've been able to condense a scene info from 2750 to 92 lines, x30 shrink! 😎
and the generated flake.yml
can be simple parsed
rustracer render --width 1280 --height 720 --anti-aliasing 3 flake.yml flake.png
(5)
flake.png: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~7h
Render a scene from file (yaml formatted)
Usage: rustracer render [OPTIONS] <INPUT> <OUTPUT>
Arguments:
<INPUT> Input scene file
<OUTPUT> Output image [possible formats: ff, png]
Options:
-v, --verbose Print stdout information
--output-pfm Output also hdr image
--width <WIDTH> Image width [default: 640]
--height <HEIGHT> Image height [default: 480]
--angle-deg <ANGLE_DEG> View angle (in degrees) [default: 0.0]
-f, --factor <FACTOR> Normalization factor [default: 1.0]
-g, --gamma <GAMMA> Gamma parameter [default: 1.0]
-a, --algorithm <ALGORITHM> Rendering algorithm [default: pathtracer] [possible values: onoff, flat, pathtracer]
-n, --num-of-rays <NUM_OF_RAYS> Number of rays [default: 10]
-m, --max-depth <MAX_DEPTH> Maximum depth [default: 3]
--init-state <INIT_STATE> Initial random seed (positive number) [default: 42]
--init-seq <INIT_SEQ> Identifier of the random sequence (positive number) [default: 54]
--anti-aliasing <ANTI_ALIASING> Anti-aliasing level [default: 1]
-h, --help Print help (see more with '--help')
-V, --version Print version
(5) note: all available threads are used, set RAYON_NUM_THREADS
to override
Simple generate completion script for bash
shell (same for fish
and zsh
):
rustracer completion bash
(6)
note: close-open your shell, and here we go, tab completions now available!
Generate shell completion script
Usage: rustracer completion [OPTIONS] <SHELL>
Arguments:
<SHELL> Shell to generate script for [possible values: bash, fish, zsh]
Options:
-o, --output <OUTPUT> Specify output script file
-h, --help Print help (see more with '--help')
-V, --version Print version
(6) note: bash>4.1
and bash-complete>2.9