#bvh #ray #sah #performance #ray-tracing #tracing

rtbvh

BVH库,具有各种构建算法和利用数据包遍历的高性能

18个版本 (5个重大更改)

0.6.2 2021年7月6日
0.5.5 2021年6月30日
0.1.3 2021年1月8日
0.1.2 2020年12月27日

#62 in 渲染


7 个crate中使用 (3 个直接使用)

Apache-2.0

185KB
4.5K SLoC

Build Status crates.io

https://github.com/MeirBon/rtbvh/actions/workflows/rust.yml/badge.svg

RTBVH

用Rust编写的快速BVH库。此库包含以下BVH构建算法的实现

  • SAH与空间分割(最高质量,构建时间慢)
  • 分箱SAH(高质量,相当快)
  • 局部排序聚类构建器(构建时间非常快)

所有构建算法尽可能高效地使用多线程。还包括MBVH实现,并且所有BVH结构都实现了单射线和四射线的遍历算法。此库生成一个C/C++库,用于我的爱好渲染器

性能

在一个包含约6300个三角形的茶壶场景中,AMD 16核心5950x达到了以下性能

Bvh construction with spatial sah type of 6320 primitives took 25.171 ms
Single-threaded rays: 100000000 rays in 22446.148 ms, 4.455107 million rays per second
32 threads rays: 100000000 rays in 1384.02 ms, 72.25329 million rays per second
Single-threaded packets: 100000000 rays in 6407.564 ms, 15.606555 million rays per second
32 threads packets: 100000000 rays in 377.237 ms, 265.08536 million rays per second

Mbvh construction took 1.341 ms
Single-threaded rays: 100000000 rays in 17492.605 ms, 5.7167015 million rays per second
32 threads rays: 100000000 rays in 829.837 ms, 120.5056 million rays per second
Single-threaded packets: 100000000 rays in 5456.565 ms, 18.326548 million rays per second
32 threads packets: 100000000 rays in 287.798 ms, 347.4659 million rays per second

Bvh construction with binned sah type of 6320 primitives took 3.81 ms
Single-threaded rays: 100000000 rays in 21255.336 ms, 4.704701 million rays per second
32 threads rays: 100000000 rays in 1292.286 ms, 77.38225 million rays per second
Single-threaded packets: 100000000 rays in 6052.331 ms, 16.52256 million rays per second
32 threads packets: 100000000 rays in 353.105 ms, 283.20187 million rays per second

Mbvh construction took 1.156 ms
Single-threaded rays: 100000000 rays in 16748.16 ms, 5.970805 million rays per second
32 threads rays: 100000000 rays in 797.133 ms, 125.44958 million rays per second
Single-threaded packets: 100000000 rays in 5180.24 ms, 19.304125 million rays per second
32 threads packets: 100000000 rays in 271.036 ms, 368.95465 million rays per second


bvh-0.5 of 6320 primitives construction took 10.832 ms
Single-threaded rays: 100000000 rays  in 30220.916 ms, 3.3089666 million rays per second
32 threads rays: 100000000 rays in 2153.541 ms, 46.43515 million rays per second

用法

use rtbvh::*;
use glam::*;

#[derive(Debug, Copy, Clone)]
struct Triangle {
    vertex0: Vec3,
    vertex1: Vec3,
    vertex2: Vec3,
}

impl Primitive for Triangle {
    fn center(&self) -> Vec3 {
        (self.vertex0 + self.vertex1 + self.vertex2) / 3.0
    }

    fn aabb(&self) -> Aabb {
        let mut aabb = Aabb::new();
        aabb.grow(self.vertex0);
        aabb.grow(self.vertex1);
        aabb.grow(self.vertex2);
        aabb
    }
}

impl SpatialTriangle for Triangle {
    fn vertex0(&self) -> Vec3 {
        self.vertex0
    }

    fn vertex1(&self) -> Vec3 {
        self.vertex1
    }

    fn vertex2(&self) -> Vec3 {
        self.vertex2
    }
}

let vertices: Vec<Vec3> = vec![
    vec3(-1.0, -1.0, 0.0),
    vec3(1.0, -1.0, 0.0),
    vec3(1.0, 1.0, 0.0),
    vec3(-1.0, 1.0, 0.0),
];

let primitives: Vec<Triangle> = vec![
    Triangle {
        vertex0: vertices[0],
        vertex1: vertices[1],
        vertex2: vertices[2],
    },
    Triangle {
        vertex0: vertices[0],
        vertex1: vertices[2],
        vertex2: vertices[3],
    },
];

let aabbs = primitives.iter().map(|t| t.aabb()).collect::<Vec<Aabb>>();

let builder = Builder {
    aabbs: aabbs.as_slice(),
    primitives: primitives.as_slice(),
};

// Choose one of these algorithms:
let bvh = builder.clone().construct_locally_ordered_clustered();
let bvh = builder.clone().construct_binned_sah();
let bvh = builder.construct_spatial_sah();

计划

  • 基准测试
  • 增加对大于4的数据包的支持
  • 增加FFI API的覆盖率

依赖项

~5MB
~133K SLoC