3个版本

0.0.16 2024年3月2日
0.0.14 2021年8月15日
0.0.1 2021年8月2日

#1972 in 游戏开发

MIT/Apache

6.5MB
38K SLoC

Rust 34K SLoC // 0.0% comments GLSL 3K SLoC // 0.3% comments Metal Shading Language 1K SLoC HLSL 540 SLoC // 0.0% comments Batch 10 SLoC Shell 9 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未来不会有太多改进/支持。

请注意,此crate仍处于0.1.0预发布状态!

  • 文档
  • 对于rustdoc:在crate(docs.rs)的根目录下运行cargo doc --no-deps --open(docs.rs不完整,因为它不包含功能构建)

路线图

  • rafx-api的API不太可能发生重大变化
  • 其他高级crate正在根据演示改进和其他项目中的使用情况进行重构/改进
  • 对于近期未来,重点将放在
    • 框架改进(可见性、多线程、API易用性)
    • 探索允许以模块化方式添加渲染功能,使用户更易于共享其工作的选项
    • 完善现有后端并添加新后端
    • 扩展演示,包含更多渲染技术

在发布本项目的0.1.0之后,此crate将遵循语义版本控制规则。0.0.x版本不遵循语义版本控制规则。

安全性

Rafx是不安全的,因为硬件加速渲染从根本上是不安全的。然而,我们仅将unsafe关键字用于当操作因除与GPU交互以外的其他原因产生未定义行为时。请参阅以下文档以获取更多详细信息

先决条件

CMake必须在您的路径中可用。它由SDL2在演示中使用,并由上游crate在着色器管道中使用。

运行演示

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

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网格。强烈建议使用配置文件覆盖来优化上游crate。在调试模式下,资产处理速度极慢。(即30秒而不是2秒)

演示功能

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

工具

渲染器包括一些处理着色器和将数据打包到二进制块的工具。

还有一个正在开发的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或Metal源代码
  • 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从rafx包中的rafx框架
  • assets:包含并重新导出rafx从rafx包中的rafx资产
  • renderer:包含并重新导出rafx渲染器从rafx包

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

常见问题解答

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

答案:资产通过 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

依赖项

~24–38MB
~603K SLoC