#gfx-hal #rendy #graphics

rendy-core

Rendy工具

2个版本

0.5.1 2019年11月7日
0.5.0 2019年11月3日

#15 in #rendy

Download history 55/week @ 2024-03-13 84/week @ 2024-03-20 96/week @ 2024-03-27 99/week @ 2024-04-03 58/week @ 2024-04-10 60/week @ 2024-04-17 69/week @ 2024-04-24 77/week @ 2024-05-01 62/week @ 2024-05-08 60/week @ 2024-05-15 65/week @ 2024-05-22 72/week @ 2024-05-29 52/week @ 2024-06-05 51/week @ 2024-06-12 56/week @ 2024-06-19 40/week @ 2024-06-26

204 每月下载量
14 个crate中使用 (12 个直接使用)

MIT/Apache

61KB
1.5K SLoC

Build Status Crates.io docs page MIT/Apache Lines of Code

基于 gfx-hal 的渲染引擎,该引擎模仿了 Vulkan API。

构建

此库需要目标平台的标准构建工具,除了Windows之外 - spirv-compiler功能需要安装Ninja才能进行编译。 https://ninja-build.org

功能

最重要的是,rendy 通过检查重要状态和不变性,提供更安全的API。它使用标记类型进行静态检查,并使用存储值进行动态检查。

能力

队列家族能力定义了家族支持的队列操作。 rendy 提供简单的机制来防止记录不受支持的命令。可以通过将能力类型之一(TransferGraphicsComputeGeneralGraphicsCompute 合并))标记到 Family 类型上,将队列的能力级别静态地存储。或者可以使用 Capability 类型代替标记类型,这样就可以动态地检查实际的能力级别。

命令缓冲区

rendy 提供了一个名为 CommandBuffer 的方便包装器。与它的原始版本相比,这个包装器直接将有关其状态的关键信息编码到类型中。这意味着用户无法意外

  • 记录其所属队列家族不支持的操作。
  • 记录命令缓冲区不在记录状态时发出命令。
  • 在渲染通道外记录渲染通道命令。
  • 在提交之前忘记完成记录缓冲区。
  • 重新提交只用于一次使用的命令缓冲区。
  • 将主缓冲区的执行记录到次级缓冲区。
  • 等等

内存管理器

rendy 的内存管理器称为 HeapsHeaps 提供了基于使用和可见性要求的设备可见内存子分配的便捷方法。它还处理特定使用类型的映射。对于 gfx-hal 采用 VMA 是可能的。在这种情况下,rendy 将使用它。

渲染图

rendy 的渲染图允许以简单的模块化风格编写渲染代码。请注意,这并非高级图形库提供的场景图,其中图中的节点对应于世界中复杂的对象。相反,它是一个具有不同属性的渲染过程的图。这使得从简单的部分组合复杂的帧变得更加容易。用户定义节点,声明它读取和写入哪些缓冲区和图像,渲染图负责暂态资源分配和执行同步。用户只需负责节点内的同步。

DynNode 实现 - RenderPassNode 可以从收集到子过程中的 RenderGroup 构造。 RenderPassNode 将执行创建渲染过程和子过程同步的所有工作。将有更多的 NodeDynNodeRenderGroup 实现,以进一步简化使用并减少各种用例所需的样板代码。

马戏团

这种马戏团和队列的混合简化了同步对资源的宿主访问。 Cirque 从资源特定分配器(例如,CommandPoolCommandBufferFactoryBuffer)分配资源的副本,并提供对未使用的副本的访问。

CPU-GPU 数据流

Rendy 可以帮助在设备和宿主之间发送数据。 Factory 类型可以将数据上传到设备本地内存,选择最合适的技巧。

  • 如果设备本地内存恰好是 CPU 可见的,将使用内存映射。
  • 相对较小的数据将直接上传到缓冲区。
  • 对于更大的上传或任何图像上传,将使用暂存缓冲区。 Factory 将根据用户请求自动插入同步命令。

GPU-CPU 数据流 - 尚未实现

数据驱动管道 - 进行中

我们认为在许多常见情况下,以半自动模式向 GPU 提供数据是可能的。 rendy::graph::node::render::RenderGroup 实现将使用 spirv-reflect(或类似包)直接从着色器读取布局信息,并使用它来自动填充描述符并根据注册的数据编码器和提供的场景实例设置索引/顶点缓冲区。当前的 进行中 实现将使用 specs::World 作为渲染的场景。

声明性管道 - 计划中

管道和描述符集具有声明性,以声明性定义它们要容易得多。 rendy 提供了一个名为 DescriptorSet 的 trait,通过它自动生成设置创建、写入和绑定的必要代码。从 GraphicsPipeline trait 派生将生成图形管道创建和使用的代码。对于计算管道,存在类似的 ComputePipeline trait。

示例

#[derive(DescriptorSet)]
struct Example {
    /// This field will be associated with binding 1 of type `VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER`.
    /// Actual `Buffer` will be allocated and kept updated by `Set<Example>`.
    #[descriptor(UniformBlock)]
    transform: mat4,

    /// This field will be associated with binding 2 of type `VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE`.
    /// `ImageView` will be fetched from `Texture` which implements `Borrow<ImageView>`.
    #[descriptor(SampledImage)]
    texture: Texture,

    /// Raw `gfx-hal` objects can be used as well.
    /// But this field will make binding `Set<Example>` to a command buffer an unsafe operation
    /// since it is the user's job to ensure that this raw image view is valid during command buffer execution.
    #[descriptor(unsafe, SampledImage)]
    foo: RawImageView,
}

模块化

rendy提供的多数功能都可以独立使用,这有助于保持API的整洁和可维护性。顶级库rendy为每个子库提供了功能,以便可以单独启用(启用子库也将启用其依赖项)。

更新日志

谁在使用它?

如果您知道其他使用rendy的项目,请友好地提交一个PR或问题。

许可证

在以下任一许可证下授权:

任选其一。


lib.rs:

包含其他rendy库使用的实用模块的库

依赖项

~2–15MB
~186K SLoC