4个版本 (2个重大变更)
0.3.0 | 2024年2月19日 |
---|---|
0.2.0 | 2021年6月10日 |
0.1.1 | 2021年5月27日 |
0.1.0 | 2021年5月27日 |
#9 in 渲染引擎
1MB
5K SLoC
Crystal Ball
Crystal Ball 是一个用Rust编写的路径追踪库。
它使用 rayon 进行并行化,并且可以通过 image 包将渲染的图像保存到各种格式。
请注意,Crystal Ball是一个兴趣爱好项目,未来版本很可能会看到很多API变更。
功能
- 多线程CPU渲染
- 将渲染的图像保存到各种格式
- 环境纹理
- 通用PBR材料
- 形状:球体和三角形网格
- 轻松创建自己的纹理、材料和形状
- 加载glTF文件
- 景深
- 边界体积层次结构
- 可选使用Open Image Denoise进行去噪
用法
基本示例
一个基本示例,渲染两个球体。
use std::default::Default;
use std::sync::Arc;
use crystal_ball::prelude::*;
fn main() -> Result<(), Error> {
let objects = vec![
Object::new(
Arc::new(Sphere::new()),
Arc::new(PbrMaterial {
base_color: Color::new(1.0, 0.45, 0.31),
..Default::default()
}),
),
Object::new(
Arc::new(
Sphere::new()
.translate(Vec3::new(0.0, -101.0, 0.0))
.scale_xyz(Vec3::splat(100.0)),
),
Arc::new(PbrMaterial::default()),
),
];
let scene = Scene {
objects,
camera: Camera::default().translate(Vec3::new(0.0, 0.0, 5.0)),
..Default::default()
};
let engine = RenderEngine::default();
let image = engine.render(&scene);
image.write("basic.png")?;
Ok(())
}
这会产生以下图像
有许多其他示例展示了Crystal Ball的能力,演示了如何使用不同的功能。
坐标系
Crystal Ball使用右手坐标系,其中
- +X向右指
- +Y向上指
- +Z指向屏幕
去噪
Crystal ball可以可选地使用Rust绑定对Open Image Denoise进行去噪。
要使用此功能,您需要安装Open Image Denoise并设置环境变量OIDN_DIR
为Open Image Denoise安装的根目录。
在您的Cargo.toml
中启用oidn
功能
[dependencies.crystal_ball]
version = "0.3.0"
features = ["oidn"]
现在您可以在Rust代码中使用去噪方法。
fn main() -> Result<(), Error> {
// ...
let mut image = engine.render(&scene);
image.denoise()?;
image.write("image_denoised.png")?;
}
优化
编译器优化将极大地提高您的路径追踪代码的性能,但代价是更长的编译时间。为了方便地在快速编译和高度优化的代码生成之间切换,您可以将以下行放入您的Cargo.toml
。有关此操作详细说明,请参阅Cargo手册。
[package]
# ...
[profile.dev]
opt-level = 3
[profile.release]
# Reduce binary size
#panic = "abort"
#strip = "symbols"
# Improve performance but increase compile time
lto = "fat"
codegen-units = 1
功能标志
可选功能
名称 | 描述 |
---|---|
oidn |
使用Open Image Denoise进行图像去噪 |
参考/资源
- https://raytracing.github.io/books/RayTracingInOneWeekend.html
- https://github.com/ekzhang/rpt
- https://tavianator.com/2014/ray_triangle.html
- https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/moller-trumbore-ray-triangle-intersection
- https://en.wikipedia.org/wiki/Möller–Trumbore_intersection_algorithm
- https://pbrt.org/
- https://www.rs-pbrt.org/
依赖项
~10–18MB
~214K SLoC