6个版本

0.0.7 2021年2月6日
0.0.6 2021年2月4日
0.0.5 2021年1月31日

#2283 in 游戏开发


用于 rafx-resources

MIT/Apache

2.5MB
56K SLoC

Rafx

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

本包包含几个层次

  • rafx-api:低级图形API抽象
  • rafx-framework:中级框架,简化资源管理、生命周期处理和绘制调用调度
  • rafx-assets:与distill集成的资源层

Rafx还提供构建着色器和打包资源的工具。

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

  • 文档
  • 在包根目录下运行cargo doc --no-deps --open(docs.rs由于不构建功能而不完整)

Build Status

Video of Renderer in Use

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

Screenshot demonstrating realtime shadows

路线图

  • rafx-api的API不太可能发生重大变化
  • rafx-frameworkrafx-assets可能会根据演示改进和其他项目中的试运行进行重构/改进
  • 对于近期未来,重点将放在
    • 添加更多文档
    • 完善现有后端
    • 通过更多渲染技术扩展演示

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

运行演示

应从仓库根目录运行演示。以下命令应克隆仓库并运行演示。

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

演示使用SDL2,在调试模式下使用vulkan验证。如果您运行演示时遇到问题,请检查SDL2和vulkan的依赖项是否可用。

演示功能

  • 渲染线程与主线程解耦 (图)
  • 着色器构建管道 (图)
  • 异步资产加载
  • 资产可以流式传输到远程硬件(例如手机)
  • 或者资产可以被烹饪成二进制blob以进行分发
  • 热重载资产(需要更多工作,某些资产类型不可靠)
  • 渲染图可用于高效且灵活地定义渲染管道,包括渲染到纹理和多个摄像头。
  • 自动生成的着色器绑定使使用描述符集变得方便且错误率更低。
  • 支持多遍的材质系统
  • 多摄像头支持(例如,生成阴影图)
  • 演示游戏状态存储在ECS中(注意:演示使用legion但渲染器与ECS无关)
  • PBR网格
  • 精灵
  • 调试绘图
  • imgui
  • 带色彩溢出的HDR管道
  • 点、聚光灯和方向光
  • 多个点/聚光灯/方向光软阴影

工具

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

着色器处理器

此工具解析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或Metal源代码
  • rafx在运行时使用的元数据
  • 使处理着色器更容易的Rust代码
  • 用于调试/检查的中间格式

着色器包可以作为资产加载,并包含加载编译后的着色器所需的所有内容。

打包资产

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

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

功能

  • rafx-vulkan:使用vulkan后端
  • rafx-metal:使用metal后端

crate

  • rafx-base - 共享助手/数据结构。没有什么令人兴奋的
  • rafx-api - 渲染API抽象层。
    • Vulkan后端(Windows/Linux)
    • macOS/iOS的金属后端
  • rafx-nodes - 受2015年GDC演讲“《命运》的多线程渲染架构”的启发。(这是一个低成本版本,工作实际上还不是MT)
    • 具有提取、准备和写入阶段的作业系统
    • 渲染通过模拟线程进行管道化,并且作业结构旨在高度并行
    • 处理多个视图和阶段,允许高级功能,如阴影图
    • 灵活的排序机制,用于交错和批量写入来自多个渲染功能的命令
  • rafx-visibility - 占位符可见性系统。目前不执行任何操作(始终返回所有可见对象)。有关更多信息,请参阅GDC演讲。
  • rafx-framework - 图像、缓冲区、描述符集等资源的资源管理
    • 大多数内容都进行了哈希处理和引用计数
    • 提供渲染图
    • 几乎所有资产都是从可序列化和可哈希的结构中数据驱动的,而不是硬编码。
    • 当可用时,缓冲区和图像将在专用传输队列上异步上传
    • 具有可绑定参数的多遍材料抽象
  • rafx-assets - 资产加载和管理系统。
    • 资产可以从文件中热重载(但请参阅#14
    • 由于distill预先处理并存储随变化而变化的缓存资产,因此可以实施自定义处理/打包,同时保持非常快的加载时间。例如,纹理压缩可以实施为导入步骤。
    • 为在运行时创建资产提供单独的多线程友好路径

许可证

根据您的选择,许可权下

上游依赖项

demo/fonts目录包含几个字体,它们的许可证各不相同

assets/blender包含来自https://freepbr.com的一些着色器,可在其自身的许可证下使用。

某些依赖项可能具有其他许可证。这些许可证包括“ISC”、“CC0-1.0”、“BSD-2-Clause”、“BSD-3-Clause”和“Zlib”。这些许可证在每次CI运行中使用cargo-deny进行最佳努力验证。

致谢

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

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意提交以包含在作品中的贡献,将按上述方式双许可,而无需任何额外条款或条件。

请参阅LICENSE-APACHELICENSE-MIT

依赖项

~3.5MB
~102K SLoC