10个版本 (4个破坏性版本)

0.5.1 2019年11月7日
0.4.1 2019年10月14日
0.3.2 2019年7月19日
0.1.1 2019年2月9日
0.1.0 2018年7月13日

#44 in 渲染

Download history 544/week @ 2024-03-13 810/week @ 2024-03-20 760/week @ 2024-03-27 710/week @ 2024-04-03 616/week @ 2024-04-10 749/week @ 2024-04-17 751/week @ 2024-04-24 647/week @ 2024-05-01 662/week @ 2024-05-08 660/week @ 2024-05-15 722/week @ 2024-05-22 842/week @ 2024-05-29 620/week @ 2024-06-05 503/week @ 2024-06-12 608/week @ 2024-06-19 537/week @ 2024-06-26

每月 2,391 次下载
29 个crate中使用了 29 (4个直接使用)

MIT/Apache

280KB
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提供简单机制以防止记录不受支持的命令。可以通过用能力类型之一(TransferGraphicsComputeGeneral)标记Family类型来静态地存储队列的能力级别。或者可以使用Capability类型而不是标记类型,这样就可以动态地检查实际的能力级别。

命令缓冲区

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

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

内存管理器

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

渲染图

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

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

环形队列

这种马戏团和队列的混合简化了同步主机对资源的访问。Cirque从资源特定分配器(例如,CommandPool用于CommandBufferFactory用于Buffer)分配资源的副本,并给出对未使用的副本的访问权。

CPU-GPU数据流

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

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

GPU-CPU数据流 - 尚未实现

数据驱动管线 - 工作进行中

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

许可证

许可方式为以下之一

任选其一。

依赖项

~2–22MB
~304K SLoC