#ray-tracing #graphics #hardware-accelerated #vulkan-graphics

rustic-zen

Photon-Garden 光线追踪器,用于创建艺术渲染

4 个版本 (2 个破坏性更新)

0.6.0 2024 年 1 月 28 日
0.3.0 2024 年 3 月 13 日
0.2.0 2024 年 2 月 1 日
0.0.2 2019 年 1 月 5 日
0.0.1 2019 年 1 月 5 日

#24渲染

Download history 95/week @ 2024-03-09 18/week @ 2024-03-16 4/week @ 2024-03-23 14/week @ 2024-03-30

每月 197 次下载

MPL-2.0 许可证

255KB
4.5K SLoC

Rustic Zen

硬件加速 2D 光线追踪框架及 Zenphoton 的 Rust 实现。

Crates.io Version docs.rs Gitlab Pipeline Status Crates.io Downloads (recent)

该光线追踪器模拟单个光子在 2D 沙盒中弹跳,然后绘制其路径。图像由数百万个单个光子轨迹的总和组成,在最终图像中创建独特的编织纹理。

Rustic Zen 通过模拟单个光子并追踪其在 2D 空间中弹跳的路径来从场景定义中渲染艺术品。

光子由光源生成并与对象交互。每次交互都会导致光子被吸收或根据对象材质中定义的规则以新方向继续传播。

此实现使用 Vulkan 提供图像的硬件加速渲染(尽管光线追踪计算仍在 CPU 上进行)

该库提供的功能

该库仅包含渲染框架和定义场景的模型。定义场景的功能,即生成和动画算法在此处未提供。Rustic-Zen 的重点是提供用于渲染静态场景的光线追踪算法。

Rustic-Zen 提供一个基本的着色器,以便与先前的艺术作品保持向后兼容。预计专用库用户将使用公开的 Material 特性来创建自己的着色器。

示例用法

extern crate rustic_zen;
extern crate png;

use rustic_zen::prelude::*;
use rustic_zen::material::hqz_legacy;
// To use encoder.set()
use png::HasParameters;

use std::sync::Arc;

fn main() {
    // Set up constants.
    let width: f64 = 1920.0;
    let height: f64 = 1080.0;
    
    // Build a basic Material
    let m = hqz_legacy(0.3, 0.3, 0.3);
    
    // Build a basic Object
    let o = Object::line_from_points((0.0,(height * 0.75)), (width, (height * 0.75)), m);

    // Build a basic Light
    let l = Light{
        power: 1.0.into(),
        x: (width / 2.0).into(),
        y: (height / 2.0).into(),
        polar_angle: 0.0.into(),
        polar_distance: 0.0.into(),
        ray_angle: (360.0, 0.0).into(), // creates a linear range
        wavelength: Sampler::new_blackbody(4500.0),
    };
    // Construct a renderer object and add the light and object to it.
    let s = Scene::new(width as usize, height as usize).with_object(o).with_light(l);
    
    // Create an image to render into
    let mut image = Arc::new(Image::new(width as usize, height as usize));

    // Render Image
    println!("Tracing Rays");
    let (rays, image) = s.render(RenderConstraint::TimeMS(1000), 1, &mut image);
    // this call should probably be more like 5000 - 15000 ms and use your number of threads,
    // but this example is run by various CI tools, and tests can't take too long.
    // Output the Image as a Vec<u8>
    println!("Serializing!");
    let data = image.to_rgba8(rays, 0.7, 1.2);
    
    let mut encoder = png::Encoder::new(w, width as u32, height as u32);
    encoder.set(png::ColorType::RGBA).set(png::BitDepth::Eight);
    let mut writer = encoder.write_header().unwrap();
    writer.write_image_data(&data).unwrap();
}

示例输出

example output

构建

默认情况下,该库使用 Vulkano 来访问硬件加速。要使用此功能,您需要一个功能正常的 Vulkan 开发环境,以及您平台上的 Vulkano 的构建依赖项。有关配置机器的更多信息,请参阅 Vulkano 0.34 Readme 中的“设置和故障排除”部分。

如果您无法提供 Vulkan 环境(例如在 CI 服务器或旧硬件上构建),可以通过禁用默认功能来禁用 Vulkano 依赖项。这将仅留下软件渲染可用。更多信息 在这里

版本控制

在测试版中,版本号将是 0.*.*,每个次要版本都将进行破坏性更新。在 1.0.0 之后将使用语义版本控制。

许可证

从版本0.2.1开始,库代码、所有测试和文档均在Mozilla公共许可证v.2.0下授权。有关此许可证的完整条款,请参阅LICENCE文件。

示例目录中的代码以及所有由示例创建的艺术作品均为版权所有(SEGFAULT),并在此项授权外以Creative Commons署名-非商业性-相同方式共享4.0国际公众许可证授权。如需了解此许可证的完整条款,请参阅LICENCE-EXAMPLES文件。

依赖项

~1–14MB
~177K SLoC