12 个版本
0.0.16 | 2024年3月2日 |
---|---|
0.0.15 | 2022年5月16日 |
0.0.14 | 2021年8月15日 |
0.0.13 | 2021年5月27日 |
0.0.5 | 2021年1月31日 |
#1850 in 游戏开发
267 每月下载量
2.5MB
58K SLoC
Rafx
Rafx 是一个优先考虑性能、灵活性和生产力的多后端渲染器。它可选地与 distill
资源管道集成,为多学科团队的实际项目提供工作流程和工具。
此软件包包含几个层级
rafx-api
: 最低级别的图形 API 抽象rafx-visibility
: 最低级别的保留 API,用于确定可见性rafx-framework
: 中级框架,简化资源管理、生命周期处理和绘制调用调度rafx-assets
: 集成distill
的资源层rafx-renderer
: 具有插件系统的管道式渲染器rafx-plugins
: 许多基本和高级渲染技术及功能的实现
Rafx 还提供构建着色器和资源工具。
文档
Amazon Lumberyard Bistro 场景(原始资源:https://developer.nvidia.com/orca/amazon-lumberyard-bistro)
(贴图截图是导入的 ldtk 项目文件)
当前支持
Rafx 支持大多数主流平台。可以通过添加额外的后端来支持专有平台。
平台 | Vulkan | Metal | DX12 | GL ES 3.0 (4,5,6) |
---|---|---|---|---|
Windows | ✅ | ✅ | ✅ | |
macOS | ✅ | ✅ | ✅ | |
Linux | ✅ (1) | ✅ (1) | ||
iOS | ✅ | ✅ | 🟥 (3) | |
Android | 🟨 (2) | 🟥 (3) | ||
WebGL (6) | ✅ |
注意事项:
- 某些后端/驱动程序/窗口管理器组合可能无法工作。最近测试了 Ubuntu 20.04 LTS。
- Android 可能与 vulkan 一起工作,但尚未测试。(可能可以使其工作)
- 移动 OpenGL 设备可能可以工作,但可能需要改进以创建初始 OpenGL 图形上下文。
- OpenGL ES 3.0 API 的限制阻止了完整的实现。主要演示在 GL ES 2.0/3.0 中无法完全工作。
- OpenGL ES 3.0 后端仍然使用 2.0 路径来处理某些功能。还有改进的空间!
- OpenGL/WebGL 将不会在今后得到太多改进/支持。
请注意,这个crate目前仍处于pre-0.1.0状态!
- 文档
- 对于rustdoc:在crate的根目录下运行
cargo doc --no-deps --open
(因为不构建特性,docs.rs不完整)
路线图
- rafx-api的API不太可能发生重大变化
- 其他高级crate正在根据演示改进和其他项目中进行的狗食(dogfooding)进行重构/改进
- 对于近期未来,重点将放在以下方面:
- 框架改进(可见性、多线程、API易用性)
- 探索添加渲染功能的方法,让最终用户更容易共享他们的工作
- 完善现有后端并添加新后端
- 扩展演示以包含更多渲染技术
在发布项目的0.1.0版本之后,此crate将使用语义版本控制规则。0.0.x版本不遵循语义版本控制规则。
安全性
Rafx是不安全的,因为硬件加速渲染本质上是不安全的。然而,我们仅在使用unsafe关键字时保留操作,当操作由于与其他GPU交互之外的原因可能导致未定义行为时。请参阅以下文档以获取更多详细信息
- https://github.com/aclysma/rafx/blob/master/docs/api/api_design.md#safety
- https://github.com/aclysma/rafx/blob/master/docs/api/safety.md
先决条件
CMake必须在您的路径上可用。它在演示和上游crate中用于SDL2,以及用于着色器管道。
运行演示
演示应从存储库中的演示目录运行。以下命令将克隆repo并运行演示。
git clone https://github.com/aclysma/rafx.git
cd rafx
cd demo
cargo run --bin demo --release --features "[BACKEND_FEATURE]"
BACKEND_FEATURE应该是rafx-vulkan
、rafx-metal
或某些其他后端。
以发布模式运行会减少日志记录并禁用GPU验证。第一次运行将较慢,因为它需要导入资产,包括一个带有大纹理的GLTF网格。强烈推荐使用配置文件覆盖来优化上游crate。在调试模式下,资产处理速度极慢。(即30秒而不是2秒)
演示功能
- 渲染线程与主线程解耦 (图)
- 着色器构建管道 (图)
- 离线纹理压缩和米普生成(通过basis-universal格式)
- 异步资产加载
- 可以将资产流式传输到远程硬件(例如,手机)
- 或者可以将资产烹饪成一个二进制blob进行分发
- 热重新加载资产(需要更多工作,某些资产类型不可靠)
- 渲染图可用于高效灵活地定义渲染管道,包括渲染到纹理、多个摄像头和计算着色器。
- 自动生成的着色器绑定使使用描述符集变得方便且错误率较低。
- 支持多个传递的材质系统
- 支持多摄像头(例如,用于生成阴影图)
- 将演示游戏状态存储在ECS中(注意:演示使用legion,但渲染器是ECS无关的)
- PBR网格
- 精灵
- 调试绘制
- imgui/egui
- 具有阴影图缓存的分组前向光照,支持100+阴影投射光源
- 具有泛光/自动曝光/TAA/SSAO/FidelityFX CAS的HDR管道
- HDR显示支持(仅在macOS上测试,可能与vulkan一起工作)
- 点、聚光灯和方向光
- 多个聚光灯/方向光/点光软阴影
- 字体渲染
- LDTK瓦片地图导入
- 二维或三维中多个摄像机的截锥体裁剪,既可以是正交投影也可以是透视投影
工具
渲染器包括一些用于处理着色器和打包二进制blob中数据的工具。
还有一个可以工作的blender插件,但目前仍在原型设计阶段,尚未文档化。
着色器处理器
此工具解析GLSL并生成相应的rust代码。这使得使用描述符集更容易、更安全!
- 工具位于 /shader-processor
- 示例包括一个
shaders
crate,用于编译生成的rust代码。它位于 /demo/shaders。仅自动生成rust代码,不包括Cargo.toml。 - 在示例中“刷新着色器”的最简单方法是单击该文件夹中的compile.bat或compile.sh
- 您可以通过以下方式安装
cargo install rafx-shader-processor
。请确保安装与您项目中包含的相同版本。此外,如果您更新了项目依赖项,请务必更新它!
着色器处理器生成以下资产工件
- 特定于API的,如编译后的SPIR-V或金属源代码
- rafx在运行时使用的元数据
- 使着色器更容易使用的rust代码
- 用于调试/检查的中间格式
着色器包可以作为一个资产加载,包含加载编译后的着色器所需的所有内容。
打包资产
此工具目前仅用于打包资产。
- 按照以下方式打包文件:
run --package cli -- --pack out.pack
- 按照以下方式运行示例:
run --package demo -- --packfile out.pack
- 您可能希望为此工具创建一个从您自己的main.rs创建的二进制文件。这样,您可以添加自己的资源类型。
Blender 插件
还有一个blender插件,它实现了大型级别的工怍流程,并导出了一种自定义格式,以避免重复共享资产数据。虽然它功能正常,但仍在早期实现阶段,尚未文档化。
- 导出:它自动导出纹理、材质、网格、模型(具有LOD级别的网格集)和场景,以易于消费的格式,避免重复共享数据,并使用预定义的目录布局和导出设置。这使得导出工作流程既简单又可靠。
- 级别编辑:支持可以处理团队环境中大规模级别的工怍流程。级别可以根据位置或功能进行切片,并单独加载。这允许创建比DCC软件支持更大的级别,并允许更细粒度的文件签出,从而减少合并冲突。与大多数DCC文件格式不同,级别和切片文件以文本格式存储,这使得它们可以进行差异化和合并。
此视频显示了一个包含 >5k 个对象、1M+ 个顶点在Blender中一次性加载的场景,并在M1 mac mini上将其切割成多个较小的部分。
功能
rafx-vulkan
:使用vulkan后端rafx-metal
:使用metal后端framework
:包含并重新导出从rafx crate中的rafx-frameworkassets
:包含并重新导出从rafx crate中的rafx-assetsrenderer
:包含并重新导出从rafx crate中的rafx-renderer
crates
rafx-base
- 共享助手/数据结构。没有什么令人兴奋的rafx-api
- 渲染API抽象层。- 适用于Windows/Linux的Vulkan后端
- 适用于macOS/iOS的Metal后端
rafx-visibility
- 保留可见性API。- 简单的基于句柄的抽象。
- 快速、线程安全的可见性查询。
rafx-framework
- 对图像、缓冲区、描述符集等资源的管理。- 大多数内容都是通过哈希和引用计数来实现的
- 提供渲染图
- 几乎所有资产都由可序列化和可哈希的结构驱动,而不是硬编码。
- 当可用时,缓冲区和图像将在专门的传输队列上异步上传
- 多通道材料抽象,带有可绑定参数
- 渲染功能和作业系统 - 受2015年GDC演讲“Destiny的并行渲染架构”的启发。
- 具有提取、准备和写入阶段的作业系统
- 渲染与模拟线程流水线化,作业结构可由应用程序并行化
- 处理多个视图和阶段,允许高级功能,如阴影映射
- 灵活的排序机制,用于交错和批量写入来自多个渲染功能的命令
- 可见性区域 - 基于
rafx-visibility
- 高级可见性API,与框架渲染作业集成
rafx-assets
- 一个资源加载和管理系统。- 资源可以从文件中热重载(但请参阅#14)
- 因为distill预处理并存储缓存资源,所以可以在保持极快的加载时间的同时实现自定义处理/打包。例如,纹理压缩可以作为导入步骤实现。
- 创建资源时使用独立的多线程路径
rafx-renderer
- 一个具有插件系统以自定义的管道化渲染器
常见问题解答
Q: 为什么我会从bincode序列化器收到神秘的崩溃
A: 资源通过serde导入并序列化为bincode。如果这些结构中的任何一个被修改,则资产需要重新导入。正确的修复方法是增加导入器的版本,这将强制重新导入受影响的资产。但是删除 .assets_db 是一个简单的修复。通常为了避免这种情况,我们不应在没有同时增加导入器版本号的情况下提交对这些结构的修改。
许可协议
在以下任一协议下授权
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可协议(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
上游依赖
demo/fonts目录包含受各自许可协议约束的几个字体
- Feather,MIT
- Material Design Icons,SIL OFL 1.1
- FontAwesome 4.7.0,可在SIL OFL 1.1下使用
mplus-1p-regular.ttf
,可在其自己的许可协议下使用。
assets/blender目录包含来自https://freepbr.com的几个着色器,可在其自己的许可协议下使用
天空盒来自
- https://opengameart.org/content/space-skyboxes-0(CC0)
- http://www.humus.name/index.php?page=Textures(CC BY 3.0)
assets/ldtk 包含来自 LDTK 级别编辑器的示例数据(MIT 协议)
- 瓦片图来自 https://ansimuz.itch.io/sunny-land-pixel-game-art(CC0 协议)
某些依赖项可能根据其他条款进行许可。这些许可证包括 "ISC","CC0-1.0","BSD-2-Clause","BSD-3-Clause" 和 "Zlib"。在每次 CI 运行时,使用 cargo-deny 进行最佳努力验证。
致谢
Rafx 受益于许多 优秀想法和项目!
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在工作中的任何贡献,将双重许可如上所述,不附加任何额外的条款或条件。
请参阅 LICENSE-APACHE 和 LICENSE-MIT。
依赖项
~49MB
~1M SLoC