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 在 命令行工具
290KB
6K SLoC
先决条件
平台要求
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)
demo.png: cpu Intel(R) Xeon(R) CPU E5520 @ 2.27GHz | threads 8 | time ~35s
360度演示场景(见 makefile
)
make demo.gif
(4)
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)
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简单生成完成脚本(同样适用于 fish
和 zsh
)
点击显示 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.1
和 bash-complete>2.9
致谢
- pytracer - 一个纯Python实现的简单光线追踪器
依赖关系
~6–15MB
~205K SLoC