8个版本 (4个重大更新)
0.5.1 | 2019年11月7日 |
---|---|
0.5.0 | 2019年11月3日 |
0.4.1 | 2019年10月14日 |
0.4.0 | 2019年8月23日 |
0.1.0 | 2019年2月9日 |
#387 在 渲染 分类中
每月2,405 次下载
在 rendy 中使用
690KB
16K SLoC
基于 gfx-hal
的渲染引擎,该引擎模仿了 Vulkan
API。
构建
此库需要目标平台的标准构建工具,除非在Windows的情况下 - spirv-compiler功能需要安装Ninja以进行编译。 https://ninja-build.org
特性
最重要的是 rendy
通过检查重要状态和不变性提供了更安全的API。它使用标记类型静态检查不变性,并使用存储的值动态检查。
能力
队列家族能力定义了家族支持的哪些操作队列。 rendy
提供了简单的机制来防止记录不支持的命令。可以通过将能力类型之一标记为 Family
类型来静态存储队列的能力级别: Transfer
、Graphics
、Compute
或 General
(Graphics
和 Compute
合并)。或者可以使用 Capability
类型代替标记类型,这样就可以动态检查实际的能力级别。
命令缓冲区
rendy
提供了一个名为 CommandBuffer
的便利包装器。与原始版本相比,此包装器将有关其状态的关键信息直接编码到类型中。这意味着用户无法意外
- 记录队列家族不支持的操作命令。
- 在命令缓冲区不在记录状态下记录命令。
- 在渲染图外记录渲染图命令。
- 在提交前忘记完成缓冲区的记录。
- 重新提交一次使用的命令缓冲区。
- 将主缓冲区的执行记录到辅助缓冲区。
- 等等
内存管理器
rendy
的内存管理器被称为Heaps
。 Heaps
提供了基于使用和可见性要求的便捷方法来子分配设备可见内存。它还处理特定使用类型的映射。对于gfx-hal
采用VMA是可能的。在这种情况下,rendy
将使用它
渲染图
rendy
的渲染图允许以简单的模块化风格编写渲染代码。请注意,这并不是由高级图形库提供的高级场景图,其中图中的节点对应于世界中的复杂对象。相反,它是一组具有不同属性的渲染通道图。这使得从简单部分组合复杂帧变得容易得多。用户定义节点,声明它读取和写入哪些缓冲区和图像,渲染图负责暂态资源分配和执行同步。用户只需负责节点内部的同步。
DynNode
实现 - RenderPassNode
可以从收集到子通道中的RenderGroup
构建。 RenderPassNode
将负责创建渲染通道并执行子通道之间的同步。将有更多的Node
、DynNode
和RenderGroup
实现,以进一步简化使用并减少各种用例所需的样板代码。
马戏团
这种马戏团和队列的混合简化了同步主机对资源的访问。 Cirque
从特定资源分配器(例如,为CommandBuffer
的CommandPool
、为Buffer
的Factory
)分配资源的副本,并提供对未使用的副本的访问。
CPU-GPU数据流
Rendy可以帮助在设备和主机之间发送数据。类型Factory
可以将数据上传到设备本地内存,并选择最合适的技术。
- 如果设备本地内存是CPU可见的,将使用内存映射。
- 相对较小的数据将直接上传到缓冲区。
- 对于更大的上传或任何图像上传,将使用阶段缓冲区。
Factory
将根据用户请求自动插入同步命令。
GPU-CPU数据流 - 尚未实现
数据驱动管道 - 进行中
我们认为在许多常见情况下,以半自动模式向GPU提供数据是可能的。rendy::graph::node::render::RenderGroup
实现将使用spirv-reflect
(或类似存储库)从着色器中直接读取布局信息,并使用它来自动填充描述符并根据注册的数据编码器和提供的场景实例设置索引/顶点缓冲区。当前的进行中实现将使用specs::World
作为场景进行渲染。
声明式管道 - 计划中
管道和描述符集具有声明性,以声明方式定义它们更容易。 rendy
为此提供了一个名为DescriptorSet
的特质。从它派生将自动生成必要的代码以进行集合创建、写入和绑定。从GraphicsPipeline
特质派生将生成创建和使用图形管道的代码。对于计算管道,存在类似的ComputePipeline
特质。
示例
#[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 或问题。
许可协议
许可协议为以下之一
- Apache License,版本 2.0,(license/APACHE 或 http://www.apache.org/licenses/LICENSE2.0)
- MIT 许可协议 (license/MIT 或 http://opensource.org/licenses/MIT)
任选其一。
lib.rs
:
Rendy 引擎的帧图实现。
依赖关系
~5–19MB
~267K SLoC