6 个版本 (稳定版)

1.0.4 2024 年 4 月 6 日
1.0.3 2023 年 12 月 31 日
1.0.2 2023 年 1 月 16 日
1.0.1 2022 年 7 月 12 日
0.4.0 2022 年 7 月 12 日

#32命令行工具

GPL-3.0 许可证

290KB
6K SLoC


Logo

纯 Rust 编写的多线程光线追踪器

CI Coverage CD E2E
Version Cratesio Version
License

先决条件

平台要求

  • x86_64-unknown-linux-gnu (1)
  • x86_64-unknown-linux-musl

(1) 备注: glibc 版本 >= 2.35

构建要求

  • 对于 用户,请安装 cargo 稳定版最新构建系统(参见 rust-toolchain.toml 以获取稳定版本)

  • 对于 开发者,请安装 rustup,这将自动配置正确的工具链

    对于单元测试覆盖率,需要额外的组件 cargo-tarpaulin

    有一个方便的 makefile,可用于

    • 预览使用 rustdoc 构建的文档
    • 预览使用 cargo-tarpaulin 创建的 html 代码覆盖率分析
    • 创建演示动画

安装

从二进制文件安装

安装二进制文件

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) 备注: 将在 ~/.local/bin 中安装最新的 musl 版本

从源代码安装

从源代码安装,模板可以是

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) 备注: 将在 ~/.cargo/bin 中安装最新版本

使用方法

rustracer

子命令 描述
rustracer-convert 将 hdr 图像转换为 ldr 图像
rustracer-demo 渲染简单的演示场景(示例用途)
rustracer-render 从文件(yaml格式)渲染场景
rustracer-completion 生成shell完成脚本(隐藏)

点击显示 rustracer -h
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


rustracer-convert

将pfm文件转换为png

rustracer转换图像.pfm图像.png

点击显示 rustracer-convert -h
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


rustracer-demo

渲染演示场景

rustracer demo --width 1920 --height 1080 --anti-aliasing 3 demo.png  (4)
rustracer-demo-png

demo.png: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~35s


360度演示场景(见 makefile

make demo.gif  (4)
rustracer-demo-gif

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


点击显示 rustracer-demo -h
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) 备注:使用所有可用线程,将 RAYON_NUM_THREADS 设置为覆盖


rustracer-render

从场景文件 examples/demo.yml 渲染演示场景

rustracer render --anti-aliasing 3 examples/demo.yml demo.png  (5)

您可以使用这个示例场景来学习如何编写您自己的场景,准备进行渲染!

但是,让我们释放数据序列化语言(如yaml)中编码的场景的力量
重复的场景可能很难编写,但对于这些(以及更多)有 cue

让我们尝试渲染一个3D分形,一个 球雪flake,但无需手动编写yaml场景文件
我们可以从 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                                  # .

所以,通过这个技巧,我们已经能够将场景信息从2750行压缩到92行,缩小了30倍!😎
生成的 flake.yml 可以简单解析

rustracer render --width 1280 --height 720 --anti-aliasing 3 flake.yml flake.png  (5)
rustracer-flake

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


点击显示 rustracer-render -h
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) 备注:使用所有可用线程,将 RAYON_NUM_THREADS 设置为覆盖


rustracer-completion

bash shell简单生成完成脚本(同样适用于 fishzsh

rustracer completion bash (6)

备注:关闭-打开您的shell,现在我们有了,tab补全现在可用!


点击显示 rustracer-completion -h
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) 注意: bash>4.1bash-complete>2.9


致谢

  • pytracer - 一个纯Python实现的简单光线追踪器

依赖关系

~6–15MB
~205K SLoC