#ray-tracing #ray-tracer #monte-carlo #book #weekend #scene #render

app dalamar42/rayt

使用Rust开发的蒙特卡洛光线追踪器

1 个不稳定版本

0.1.0 2020年4月13日

图形API 中排名第511

184 个星标 & 4 个关注者

19MB
5.5K SLoC

Rayt

这是Peter Shirley的出色书籍《一个周末的射线追踪》、《射线追踪:下一周》和《射线追踪:余生》中射线追踪器的Rust实现。

这绝对不是一个功能齐全的射线追踪器。相反,这是我为了学习Rust和射线追踪而构建的。我分享它是为了帮助其他尝试同样事情的人。

功能

Rayt使用yaml文件以自己的格式存储和读取场景数据。这些只是相应Rust对象的yaml序列化。

下一节将更详细地描述两种操作模式。

  • generate 将根据代码中的预设生成场景的yaml文件
  • render 将渲染给定的yaml文件中的场景

提供了书中各种示例场景。可以使用 generate 模式在代码中对它们进行更改后快速重新生成配置文件,但对于小型场景,也可以直接编辑文件。

如何运行

本代码使用Rust 1.42 开发和测试,但它没有使用语言的任何前沿特性,因此任何相对较新的稳定版本都足以编译。

在您的本地环境中安装二进制文件

cargo install --path ${PATH_TO_THIS_REPO} 

帮助

rayt --help
rayt generate --help
rayt render --help

生成Cornell box场景yaml文件

rayt --config config/cornell_box.yaml generate --scene CornellBox

渲染Cornell box

rayt --config config/cornell_box.yaml \
    render --width 512 --rays 1000 --threads 8 --output output/cornell_box.png

某些场景使用纹理作为资源,例如《Ray Tracing: The Next Week》一书的最终场景。这些资源可以使用--asset传入。

rayt --config config/next_week_final.yaml \
    render --width 512 --rays 1000 --threads 8 --asset assets/earth.jpg --output output/next_week_final.png

--threads选项可用于控制渲染器应使用多少线程,而--rays选项将确定每个像素将采取多少射线(样本)。大约1000个样本应该足以生成一个带有一些噪声的 decent 图像,但对于清晰图像则需要更多。渲染时间将随着所选样本数量和图像大小显著增加。在我的机器上,使用5000个样本和1024像素宽度的next_week_final.yaml渲染大约需要9小时。相反,带有1000个样本和512像素宽度的cornell_box.yaml只需几分钟即可完成。

包含一些方便目标的Makefile

  • make regenerate-scenes将创建所有场景配置yaml文件
  • make render-test将以适中的分辨率和数量渲染所有场景,并将生成的图像放入output/test
  • make cornell-testmake render-test相同,但仅针对Cornell box
  • make regenerate-samples将创建Cornell box和第2本书的最终图像的高分辨率/高射线计版本,并将它们放入output/samples

样本

samples目录包含使用大量射线生成的图像,具体为每个像素5000条射线,以展示rayt可以渲染的图像类型。

资源

包含的资源来自以下来源

许可证

请参阅与此存储库一起包含的LICENSE文件。

依赖项

~20–31MB
~290K SLoC