8个版本

0.0.16 2024年3月2日
0.0.14 2021年8月15日
0.0.13 2021年5月27日
0.0.12 2021年4月17日
0.0.10 2021年3月14日

#1715 in 游戏开发

每月 21次下载
2 个crates中使用 (via rafx)

MIT/Apache

3.5MB
82K SLoC

Rafx

Rafx是一个多后端渲染器,优先考虑性能、灵活性和生产力。它可选择性地与distill资源管道集成,为多学科团队的现实项目提供工作流程和工具。

此crate包含几个层次

  • rafx-api: 低级图形API抽象
  • rafx-visibility: 低级保留API用于可见性确定
  • rafx-framework: 中级框架,简化资源管理、生命周期处理和绘制调用调度
  • rafx-assets: 集成distill的资产层
  • rafx-renderer: 具有插件系统的管道化渲染器
  • rafx-plugins: 许多基本和高级渲染技术及功能的实现

Rafx还提供了构建着色器和资源工具。

文档

Build Status

Sci-fi Base Screenshot

Editor

Amazon Lumberyard Bistro Screenshot

Amazon Lumberyard Bistro场景(原始资源:https://developer.nvidia.com/orca/amazon-lumberyard-bistro

Video of Renderer in Use

^ 在iOS硬件上运行此渲染器的视频

Screenshot of render with real-world assets

Screenshot of LDTK tilemap integration

(瓦片地图截图是导入的ldtk项目文件)

当前支持

Rafx支持大多数主流平台。可以通过添加额外的后端来支持专有平台。

平台 Vulkan Metal DX12 GL ES 3.0 (4,5,6)
Windows
macOS
Linux ✅ (1) ✅ (1)
iOS 🟥 (3)
Android 🟨 (2) 🟥 (3)
WebGL (6)

注意事项:

  1. 某些后端/驱动程序/窗口管理器组合可能不起作用。最近测试的是Ubuntu 20.04 LTS。
  2. Android可能可以通过vulkan运行,但尚未测试。(很可能可以使其工作)
  3. 移动OpenGL设备可能可以工作,但可能需要改进以创建初始OpenGL图形上下文。
  4. OpenGL ES 3.0 API的限制阻止了完整实现。主要演示在GL ES 2.0/3.0中无法完全工作。
  5. OpenGL ES 3.0 后端仍然使用 2.0 路径实现一些功能。还有改进的空间!
  6. OpenGL/WebGL 在未来的改进和支持将不会太多。

请注意,这个软件包仍然处于 0.1.0 之前的预发布状态!

  • 文档
  • 对于 rustdoc:在软件包根目录下运行 cargo doc --no-deps --open (docs.rs 不完整,因为它无法构建带有功能的特性)

路线图

  • rafx-api 的 API 很可能不会发生重大变化
  • 其他高级软件包正在根据演示改进和其他项目中的试运行进行重构/改进
  • 对于近期未来,重点关注将包括
    • 框架的改进(可见性、多线程、API 用户体验)
    • 探索添加渲染功能的模块化选项,让最终用户更容易分享他们的工作。
    • 完善现有后端并添加新后端
    • 通过更多渲染技术扩展演示

在发布本项目的 0.1.0 版本之后,这个软件包将使用语义版本控制规则。0.0.x 版本不遵循语义版本控制规则。

安全性

Rafx 是不安全的,因为硬件加速渲染本质上是不安全的。然而,我们保留使用 unsafe 关键字,当操作因为与 GPU 交互之外的原因可能产生未定义行为时。请参阅以下文档了解更多详情

先决条件

CMake 必须在您的路径上可用。在演示和上游软件包中,它被 SDL2 和着色器管道中的软件包使用。

运行演示

演示应从存储库中的演示目录运行。以下命令应该克隆存储库并运行演示。

git clone https://github.com/aclysma/rafx.git
cd rafx
cd demo
cargo run --bin demo --release --features "[BACKEND_FEATURE]"

BACKEND_FEATURE 应为 rafx-vulkanrafx-metal 或其他后端。

以发布模式运行减少日志记录并禁用 GPU 验证。第一次运行会较慢,因为它需要导入资产,包括一个带有大纹理的 GLTF 网格。**强烈推荐使用配置文件覆盖来优化上游软件包。在调试模式下,资产处理非常慢。(即 30 秒而不是 2 秒)**

演示功能

  • 渲染线程与主线程解耦 (图表)
  • 着色器构建管道 (图表)
  • 离线纹理压缩和米普映射生成(通过 basis-universal 格式)
  • 异步资产加载
  • 资产可以流式传输到远程硬件(例如手机)
  • 或者资产可以制作成二进制块以进行分发
  • 热重新加载资产(需要更多工作,某些资产类型不可靠)
  • 渲染图可以用于高效且灵活地定义渲染管道,包括渲染到纹理、多个摄像头和计算着色器。
  • 自动生成的着色器绑定使使用描述符集变得方便且错误率更低。
  • 支持多个遍历的材料系统
  • 多摄像头支持(例如生成阴影图)
  • 演示游戏状态存储在 ECS 中(注意:演示使用 legion,但渲染器与 ECS 无关)
  • PBR 网格
  • 精灵
  • 调试绘制
  • imgui/egui
  • 具有阴影图缓存器的集群前向照明,支持 100 多个投光灯
  • HDR 流程带有 Bloom/Auto-exposure/TAA/SSAO/FidelityFX CAS
  • HDR 显示支持(仅在 macOS 上测试过,可能与 vulkan 兼容)
  • 点、聚光灯和方向性光源
  • 多个聚光灯/方向性/点光源软阴影
  • 字体渲染
  • LDTK 瓦片地图导入
  • 2D 或 3D 中多个相机的视锥剔除,支持正交或透视投影

工具

渲染器包含一些工具,用于处理着色器和将数据打包到二进制块中。

还有一个可以工作的 Blender 插件,但仍在原型设计阶段,尚未有文档。

着色器处理器

此工具解析 GLSL 并生成相应的 Rust 代码。这使得使用描述符集变得更加容易和安全!

  • 工具位于 /shader-processor
  • 演示包括一个 shaders 软件包,用于编译生成的 Rust 代码。它位于 /demo/shaders。仅自动生成 Rust 代码,不包括 Cargo.toml。
  • 在演示中“刷新着色器”的最简单方法是单击该文件夹中的 compile.bat 或 compile.sh
  • 您可以使用以下命令安装 cargo install rafx-shader-processor。请确保安装与您项目中包含的相同版本。另外,别忘了在更新项目依赖项时更新它!

Diagram illustrating that shaders are processed into .metal, .spirv, etc.

着色器处理器生成以下资产工件

  • 特定于 API 的,例如编译后的 SPIR-V 或金属源代码
  • rafx 在运行时使用的元数据
  • 使处理着色器变得更加容易的 Rust 代码
  • 用于调试/检查的中间格式

着色器包可以作为资产加载,包含加载编译后的着色器所需的一切。

打包资产

此工具目前仅适用于打包资产。

  • 按照以下方式打包文件:run --package cli -- --pack out.pack
  • 按照以下方式运行演示:run --package demo -- --packfile out.pack
  • 您可能想要为该工具创建一个从自己的 main.rs 生成的二进制文件。这样,您可以添加自己的资源类型。

Blender 插件

还有一个 Blender 插件实现了较大关卡的工作流程,并导出了一种自定义格式,以避免重复共享资产数据。虽然它功能正常,但仍在早期实现阶段,尚未有文档。

  • 导出:它自动以易于消费的格式导出纹理、材质、网格、模型(具有 LOD 级别的网格集)和场景,避免重复共享数据,具有预定义的目录布局和导出设置。这使得导出工作流程变得简单可靠。
  • 关卡编辑:支持可以处理团队环境中大型关卡的工作流程。关卡可以根据位置或功能进行切片,并单独加载。这使得创建大于 DCC 软件支持的关卡成为可能,并允许更细粒度的文件签出,从而减少合并冲突。与大多数 DCC 文件格式不同,关卡和切片文件以文本格式存储,这使得它们可比较和可合并。

Video of slice-based level editing in Blender

^ Blender 中基于切片关卡编辑的视频

此视频显示了一个包含 >5k 个对象、1M+ 个顶点同时加载到 blender 中的场景,并在 M1 mac mini 上将其切分成多个较小的部分。

功能

  • rafx-vulkan:使用 vulkan 后端
  • rafx-metal:使用 metal 后端
  • framework:包含并重新导出 rafx-framework 从 rafx 软件包
  • assets:包含并重新导出 rafx-assets 从 rafx 软件包
  • renderer:包含并重新导出rafx crate中的rafx-renderer

  • 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 - 带有插件系统以自定义它的管道化渲染器

常见问题解答

问题:为什么我会从bincode序列化程序收到神秘的恐慌

答案:资产通过serde导入并序列化为bincode。如果这些结构中的任何一个是修改过的,那么资产需要重新导入。正确的修复方法是增加导入器的版本,这将强制重新导入受影响的资产。但是删除资产.db是一个简单的修复。通常,为了避免这种情况,我们应该在没有增加导入器版本号的情况下不提交对这些结构的修改。

许可

根据您的选择,许可以下之一

上游依赖

demo/fonts目录包含几个字体,它们各自有自己的许可

assets/blender目录包含来自https://freepbr.com的一些着色器,在其自己的许可下可用

天空盒来自

assets/ldtk 包含来自 LDTK 级别编辑器的示例数据(MIT协议)

某些依赖项可能根据其他条款进行授权。这些许可证包括 "ISC"、"CC0-1.0"、"BSD-2-Clause"、"BSD-3-Clause" 和 "Zlib"。这将在每次 CI 运行中通过 cargo-deny 进行最佳努力验证。

致谢

Rafx 受益于许多 优秀想法和项目

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给作品的所有贡献,将根据上述条款双授权,没有任何额外条款或条件。

参见 LICENSE-APACHELICENSE-MIT

依赖项

~23–55MB
~758K SLoC