Logo

a multi-threaded raytracer in pure rust

CI Coverage Version License
Prerequisites · Installation · Usage

Prerequisites

Platform requirements

(1) note: glibc version >= 2.27

Build requirements

Installation

From binary

Install from binary:

curl -sSf https://andros21.github.io/rustracer/install.sh | bash  (2)


click to show other installation options

```bash

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

From source

Install from source code, a template could be:

cargo install rustracer  (3)


click to show other installation options

```bash

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

Usage

rustracer

| 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) |


click to show rustracer -h

```console rustracer 1.0.0 a multi-threaded raytracer in pure rust

USAGE: rustracer

OPTIONS: -h, --help Print help information -V, --version Print version information

SUBCOMMANDS: 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 ```


### rustracer-convert Convert a pfm file to png:
rustracer convert image.pfm image.png

click to show rustracer-convert -h ```console rustracer-convert 1.0.0 Convert HDR (pfm) image to LDR (ff|png) image USAGE: rustracer convert [OPTIONS] ARGS: Input pfm image Output image [possible formats: ff, png] OPTIONS: -f, --factor Normalization factor [default: 0.2] -g, --gamma Gamma parameter [default: 1.0] -h, --help Print help information -v, --verbose Print stdout information -V, --version Print version information ```

### rustracer-demo Rendering demo scene:
rustracer demo --width 1920 --height 1080 --anti-aliasing 3 -f 1 demo.png   (4)
rustracer-demo-png

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)
rustracer-demo-gif

demo.gif: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~15m


click to show rustracer-demo -h

```console rustracer-demo 1.0.0 Render a demo scene (hard-coded in main)

USAGE: rustracer demo [OPTIONS]

ARGS: Output image [possible formats: ff, png]

OPTIONS: -a, --algorithm Rendering algorithm [default: pathtracer] [possible values: onoff, flat, pathtracer] --angle-deg View angle (in degrees) [default: 0.0] --anti-aliasing Anti-aliasing level [default: 1] -f, --factor Normalization factor [default: 0.2] -g, --gamma Gamma parameter [default: 1.0] -h, --help Print help information --height Image height [default: 480] --init-seq Identifier of the random sequence (positive number) [default: 45] --init-state Initial random seed (positive number) [default: 45] -m, --max-depth Maximum depth [default: 3] -n, --num-of-rays Number of rays [default: 10] --orthogonal Use orthogonal camera instead of perspective camera --output-pfm Output also hdr image -v, --verbose Print stdout information -V, --version Print version information --width Image width [default: 640]

```

(4) note: all available threads are used, set RAYON_NUM_THREADS to override


### rustracer-render Rendering demo scene from scene file [`examples/demo.yml`](https://github.com/andros21/rustracer/blob/master/examples/demo.yml):
rustracer render --anti-aliasing 3 -f 1 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`](https://github.com/cue-lang/cue) Let's try to render a 3D fractal, a [sphere-flake](https://en.wikipedia.org/wiki/Koch_snowflake), but without manually write a yaml scene file\ we can automatic generate it from [`examples/flake.cue`](https://github.com/andros21/rustracer/blob/master/examples/flake.cue) ```bash 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 -f 1 flake.yml flake.png  (5)
rustracer-flake

flake.png: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~7h


click to show rustracer-render -h

```console rustracer-render 1.0.0 Render a scene from file

USAGE: rustracer render [OPTIONS]

ARGS: Input scene file Output image [possible formats: ff, png]

OPTIONS: -a, --algorithm Rendering algorithm [default: pathtracer] [possible values: onoff, flat, pathtracer] --angle-deg View angle (in degrees) [default: 0.0] --anti-aliasing Anti-aliasing level [default: 1] -f, --factor Normalization factor [default: 0.2] -g, --gamma Gamma parameter [default: 1.0] -h, --help Print help information --height Image height [default: 480] --init-seq Identifier of the random sequence (positive number) [default: 45] --init-state Initial random seed (positive number) [default: 45] -m, --max-depth Maximum depth [default: 3] -n, --num-of-rays Number of rays [default: 10] --output-pfm Output also hdr image -v, --verbose Print stdout information -V, --version Print version information --width Image width [default: 640]

```

(5) note: all available threads are used, set RAYON_NUM_THREADS to override


### rustracer-completion 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!


click to show rustracer-completion -h

```console rustracer-completion 1.0.0 Generate shell completion script

USAGE: rustracer completion [OPTIONS]

ARGS: Shell to generate script for [possible values: bash, fish, zsh]

OPTIONS: -h, --help Print help information -o, --output Specify output script file -V, --version Print version information

```

(6) note: bash>4.1 and bash-complete>2.9


Acknowledgements