15个版本

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.1 2020年11月29日

#302 in 游戏开发

Download history 53/week @ 2024-04-27 41/week @ 2024-05-04 49/week @ 2024-05-11 47/week @ 2024-05-18 51/week @ 2024-05-25 52/week @ 2024-06-01 29/week @ 2024-06-08 34/week @ 2024-06-15 32/week @ 2024-06-22 8/week @ 2024-06-29 117/week @ 2024-07-06 51/week @ 2024-07-13 25/week @ 2024-07-20 32/week @ 2024-07-27 32/week @ 2024-08-03 24/week @ 2024-08-10

119 每月下载量
用于 6 个工具包 (3 直接)

MIT/Apache

3MB
63K SLoC

Rafx

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

该工具包包含几个层级

  • 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

(Tilemap截图是导入的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是不安全的,因为硬件加速渲染本质上是不安全的。然而,我们仅在操作可以产生除与GPU交互以外的未知行为时使用unsafe关键字。请参阅以下文档以获取更多详细信息

先决条件

CMake必须在您的路径上可用。在演示和着色器管道中的上游库中使用它。

运行演示

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

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秒)

演示功能

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

工具

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

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

着色器处理器

该工具解析 GLSL 并生成对应的 rust 代码。这使得处理描述符集更容易、更安全!

  • 该工具位于 /shader-processor
  • 演示中包含一个 shaders crate,用于编译生成的 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 crate 包含和重新导出 rafx-framework
  • assets:从 rafx crate 包含和重新导出 rafx-assets
  • renderer:从 rafx crate 包含和重新导出 rafx-renderer

Crates

  • rafx-base - 共享帮助器/数据结构。没什么有趣的
  • rafx-api - 渲染 API 抽象层。
    • Vulkan 后端用于 windows/linux
    • 金属后端用于 macOS/iOS
  • rafx-visibility - 保留可见性 API。
    • 简单的基于句柄的抽象。
    • 快速、线程安全的可见性查询。
  • rafx-framework - 用于图像、缓冲区、描述符集等的资源管理。
    • 大多数内容都是哈希和引用计数的
    • 提供渲染图
    • 几乎所有资产都是从可序列化和可哈希的结构中数据驱动的,而不是硬编码的。
    • 当可用时,缓冲区和图像会在专用的传输队列上异步上传
    • 多遍次材料抽象,具有可绑定参数
    • 渲染功能和作业系统 - 受2015年GDC演讲“《命运》的多线程渲染架构”的启发。
      • 具有提取、准备和写入阶段的作业系统
      • 渲染通过模拟线程管线化,作业结构可以由应用程序并行化
      • 处理多个视图和阶段,允许使用阴影映射等高级功能
      • 灵活的排序机制,用于交错和批量写入来自多个渲染功能的命令
    • 可见性区域 - 基于rafx-visibility
      • 高级可见性API,与框架渲染作业集成
  • rafx-assets - 资产加载和管理系统。
    • 资产可以从文件中热重载(但请参阅#14
    • 由于distill在更改时预处理并存储缓存的资产,因此可以实施自定义处理/打包,同时保持非常快的加载时间。例如,纹理压缩可以作为导入步骤实现。
    • 创建运行时资产的多线程友好路径
  • rafx-renderer - 具有插件系统的管线化渲染器

常见问题解答(FAQ)

Q:为什么我会从bincode序列化器收到神秘的恐慌

A:资产通过serde导入和序列化为bincode。如果这些结构体中的任何一个被修改,则需要重新导入资产。正确的修复方法是增加导入器的版本,这将强制重新导入受影响的资产。但是,删除 .assets_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

依赖项

~5–38MB
~612K SLoC