16个不稳定版本 (3个破坏性)
0.3.1 | 2024年6月4日 |
---|---|
0.2.7 | 2024年5月18日 |
0.2.2 | 2024年3月21日 |
0.1.4 | 2023年3月24日 |
0.0.1 | 2022年11月3日 |
#57 in 图形API
1,117 每月下载量
用于 fidget_math
1MB
19K SLoC
Fidget
Fidget是复杂闭式隐式表面的实验性基础设施。
目前,它是安静公开的:它在GitHub上可用,并发布到crates.io,但在做出更大公告之前,我希望您不要将其发布到Hacker News / Twitter /等等;我计划写一篇概述博客文章,并准备一些演示应用程序。如果您有强烈的愿望谈论它,请直接联系我!
该库包含各种数据结构和算法,例如
- 数学表达式的操作和去重
- 将图转换为用于评估的直线代码("磁带")
- 基于区间评估结果进行磁带简化
- 一个非常快的JIT编译器,有手写的
aarch64
和x86_64
例程- 点评估(
f32
) - 区间评估(
[lower, upper]
) - SIMD评估(ARM上的
f32 x 4
,x86上的f32 x 8
) - 梯度评估(相对于x,y和z的偏导数)
- 点评估(
- 2D隐式表面的位图渲染(具有各种渲染模式)和3D(生成高度图和法线)
- 网格化(使用我们自己的双流形轮廓算法实现)
如果这一切听起来很熟悉,那是因为你阅读过《复杂闭式隐式表面的大规模并行渲染》。Fidget 包含了该论文中的所有构建块,但更侧重于在 CPU 上(本地)评估,而不是在 GPU 上(解释性)评估。
该库拥有详细的文档,包括 crate 级别文档中的 API 高级概述;这是一个很好的入门地方!
目前,它具有类似于乐高积木但无说明书的感觉:有许多单独记录的功能,但将它们组合成有用的东西则留给读者去练习。可能也有一些缺失的部件,API 的缝隙可能不在正确的位置;如果你要使用该库进行严肃的工作,请期待需要分叉它并进行本地修改。
欢迎提出问题和 PR,尽管我可能不会合并任何增加大量维护负担的更改。这是一个个人规模的实验性项目,所以请相应调整你的期望。
演示应用程序
在Github 上的仓库中,有两个演示应用程序
demo
从命令行进行位图渲染和网格处理viewer
是一个用于交互式探索的最小 GUI
这些故意没有发布到 https://crates.io,因为它们是演示应用程序,而不是完整的最终用户工具。
WebAssembly 演示
在 wasm-demo
子目录中嵌入 Fidget 到一个网络应用程序中。构建此演示需要主机系统上安装 wasm-pack
。
在文件夹中,用以下方式运行它:
npm install
npm run serve
或者使用以下方式打包文件进行分发:
npm run build
支持矩阵
目前,Fidget 支持有限的平台数量
平台 | JIT 支持 | CI | 支持 |
---|---|---|---|
aarch64-apple-darwin |
是 | ✅ 已测试 | ⭐️ 第 0 级 |
x86_64-unknown-linux-gnu |
是 | ✅ 已测试 | 🥇 第 1 级 |
x86_64-pc-windows-msvc |
是 | ✅ 已测试 | 🥈 第 2 级 |
aarch64-unknown-linux-gnu |
是 | ⚠️ 已检查 | 🥇 第 1 级 |
aarch64-pc-windows-msvc |
是 | ⚠️ 已检查 | 🥉 第 3 级 |
wasm32-unknown-unknown |
否 | ⚠️ 已检查 | 🥇 第 1 级 |
键说明
CI | 描述 |
---|---|
✅ 已测试 | cargo test 在指定的目标上运行 |
⚠️ 已检查 | cargo check 在指定的目标上运行 |
等级 | 描述 |
---|---|
⭐️ 第 0 级 | 维护者将该平台作为他们的日常驱动器 |
🥇 第 1 级 | 维护者可以访问此平台 |
🥈 第 2 级 | 维护者无法访问此平台,但在 CI 中进行了测试 |
🥉 第 3 级 | 维护者无法访问此平台,并且它未在 CI 中进行测试 |
支持等级代表维护者是否能够帮助解决特定平台的错误;例如,如果你发现了一个 aarch64-pc-windows-msvc
特定的错误,请期待你将做大部分的繁重工作。
CPU 要求
aarch64
平台需要 NEON 指令,而 x86_64
平台需要 AVX2 支持;这两个扩展都已有近十年历史,应该很普遍。
禁用 jit
功能允许跨平台渲染,使用解释器而不是 JIT 编译。这对于 wasm32-unknown-unknown
目标是强制性的,因为它无法生成“本地”代码。
类似项目
Fidget 与隐式建模空间中的多个项目重叠
- kokopelli:Python 中的基于脚本的 CAD/CAM*
- Antimony:来自平行宇宙的 CAD*
libfive
:实体建模的基础设施*- 复杂封闭形式隐式曲面的大规模并行渲染(MPR)*
- ImplicitCAD:强大、开源、程序化CAD
- Ruckus:怪异者的过程式CAD
- Curv:一种用于数学艺术的编程语言
- sdf:Python中的简单SDF网格生成
- Forged Thoughts:Rust中的建模与渲染语言
- Raumkuenstler:基于LLVM即时编译器的节点建模
- 可能还有更多;欢迎提交PR!
*由同一作者撰写
(MPR论文还引用了许多与相关学术工作的参考文献)
与其他项目相比,Fidget的独特之处在于它具有本机JIT,并在执行带子简化时使用该JIT。将其置于同一作者的项目中——它们都使用大致相同的渲染策略——看起来就像这样
CPU | GPU | |
---|---|---|
解释器 | libfive ,Fidget |
MPR |
JIT | Fidget | (请提供执行此操作的API) |
Fidget的本机JIT使其变得非常快。例如,以下是针对三种不同实现进行光栅化此模型的大致基准测试
大小 | libfive |
MPR | Fidget(VM) | Fidget(JIT) |
---|---|---|---|---|
1024³ | 66.8 ms | 22.6 ms | 61.7 ms | 23.6 ms |
1536³ | 127 ms | 39.3 ms | 112 ms | 45.4 ms |
2048³ | 211 ms | 60.6 ms | 184 ms | 77.4 ms |
libfive
和Fidget运行在M1 Max CPU上;MPR运行在GTX 1080 Ti GPU上。我们注意到Fidget的解释器比libfive
略好,而Fidget的JIT几乎与基于GPU的MPR具有竞争力。
Fidget缺少更多成熟项目中存在的许多功能。例如,它只包含一个调试GUI,并且其网格化程度远不如libfive
。
许可证
© 2022-2024 Matthew Keeter
在Mozilla公共许可证2.0下发布
依赖项
~8–44MB
~702K SLoC