#ray-tracing #path-tracer #graphics #scene-description #bsdf #principled

rust-pathtracer

一个基于原理的BSDF路径追踪器,具有抽象的后端。非常适合渲染程序化内容。

8个版本

0.2.4 2023年12月20日
0.2.3 2023年3月24日
0.1.2 2023年2月28日
0.1.1 2022年11月23日

81图形API 中排名

Download history 17/week @ 2024-03-13 5/week @ 2024-03-27 11/week @ 2024-04-03 3/week @ 2024-05-29

59 每月下载量
2 个crate中使用(通过 forgedthoughts

MIT 许可证

1MB
1.5K SLoC

这是将优秀的GLSL_Pathtracer 从GLSL移植到Rust,利用了抽象的后端。非常适合渲染程序化内容。

Spheres

Rust特性

  • 使用rayon进行多线程。
  • 通过场景描述trait进行抽象后端。为您的程序化内容实现碰撞检测、灯光和材质。
  • 路径追踪器可以编译为f32f64。请参阅libs.rs中的定义。默认为f64

待办事项

  • 支持介质/体积对象。
  • 实现去噪器。
  • 发射器目前未经过测试。
  • 目前只有球形解析灯光。
  • 为crate编写文档。
  • 实现基于SDF的示例场景。
  • 实现基于网格的示例场景。欢迎PR。
  • 增强示例渲染器应用程序的功能。
  • 更多测试。

如何使用

// Create a color buffer
let mut buffer = ColorBuffer::new(800, 600);

// Create a scene and pass it to the path-tracer
let scene = Box::new(AnalyticalScene::new());
let mut pt = Tracer::new(scene);

// Render and accumulate one frame, repeat
pt.render();

您可以通过调用 buffer.convert_to_u8(frame);将颜色缓冲区复制到Vec<u8>,或者您可以直接通过访问buffer.pixels来访问浮点像素。

场景

场景包含对象、灯光、背景以及材质定义。

场景trait目前很小。

pub trait Scene : Sync + Send {

    fn new() -> Self where Self: Sized;

    /// Background color for the given ray
    fn background(&self, ray: &Ray) -> F3;

    /// Closest hit should return the state.hit_dist, state.normal and fill out the state.material as needed
    fn closest_hit(&self, ray: &Ray, state: &mut State, light: &mut LightSampleRec) -> bool;

    /// Used for shadow rays.
    fn any_hit(&self, ray: &Ray, max_dist: F) -> bool;

    /// Return the camera for the scene
    fn camera(&self) -> &Box<dyn Camera3D>;

    /// Return the number of lights in the scene
    fn number_of_lights(&self) -> usize;

    /// Return a reference for the light at the given index
    fn light_at(&self, index: usize) -> &AnalyticalLight;
}

创建上述截图的分析示例场景可以在渲染器的这里找到。

渲染器

仓库包含一个示例渲染器,可以显示正在进行的渲染过程。您可以使用以下命令轻松运行它:cargo run --release。渲染器将很快增加更多功能(将图像写入磁盘、显示帧计数器等)。

CPU 与 GPU:动机

我更喜欢在 CPU 上渲染 SDF。当然 GPU 更快,也有许多优秀的 Shadertoy 演示,然而当场景的 SDF 复杂度由用户定义,并且您不知道用户的操作系统或 GPU 时,可能会发生以下情况

  • 着色器需要几秒钟才能编译,并且根据平台可能会在编译过程中冻结您的应用程序。
  • 着色器运行速度可能很慢,使得您的应用程序难以使用。
  • 在最坏的情况下,着色器可能会崩溃。

CPU 渲染速度较慢,但不需要编译着色器,渲染任务可以很好地在后台处理,而不会影响应用程序的整体性能。

依赖项

~6MB
~113K SLoC