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 中排名
59 每月下载量
在 2 个crate中使用(通过 forgedthoughts)
1MB
1.5K SLoC
这是将优秀的GLSL_Pathtracer 从GLSL移植到Rust,利用了抽象的后端。非常适合渲染程序化内容。
Rust特性
- 使用rayon进行多线程。
- 通过场景描述trait进行抽象后端。为您的程序化内容实现碰撞检测、灯光和材质。
- 路径追踪器可以编译为
f32
或f64
。请参阅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