引言
自 PC 平台引入显式图形 API 以来,资源级同步和瞬态内存的管理一直是实时渲染社区的热门话题。
过去由驱动程序负责的工作现在交由应用程序程序员来承担。这为性能提升打开了大门,但也带来了在这些 API 上实现和迁移引擎技术时需要解决的新问题。
RPS SDK 是一个位于图形 API 层之上、全新的软件层,主要目的是降低与屏障、瞬态内存管理和队列同步相关的复杂性。RPS 的基本原理是使用渲染图来预先尽可能详细地定义帧(或工作负载),通过这种方式,实现 RPS 的许多关键功能。这些功能包括但不限于:屏障插入;资源创建、放置和生命周期管理;自动图形状态设置,如渲染目标绑定;以及多队列和异步计算工作负载的高效调度。所有这些都内置了对 DirectX 12 和 Vulkan 的支持。
准确地说,最终提交到队列的命令缓冲区是通过一系列图节点执行构建的,每个节点都有一个关联的应用程序定义的 callback,该 callback 部分填充此缓冲区。RPS 负责管理此类节点调用的精确顺序,同时将内存屏障和资源状态管理命令(以及其他命令)插入到缓冲区中。
虽然这可能听起来像是倒退,因为显式 API 的目标是更低级别,但 RPS SDK 仍然是朝着正确方向迈出的一步。就像 C 提供了高级结构来表达映射到优化机器代码的逻辑一样,RPS 也提供了一套高级结构来表达图形应用程序中的数据流。RPS SDK 将这些高级结构映射到优化的低级屏障、资源堆放置和图形状态样板代码,就像精心编写的手工帧一样。C 和 RPS 的结构都几乎 1:1 地位于其下方的结构之上,并用于表达通常需要手动编写的模式。
总之,这个 SDK 通过将渲染图理念作为设计新图形应用程序编写方式的基石,将其提升到了新的高度。RPS 坚实地作为一个引擎无关、开源且高度可扩展的渲染图库,用于组件化渲染器的自然描绘和实现。
定义图 – RPSL
RPS SDK 引入了一种新型着色器,即渲染管线着色器(简称 RPS)。通过这种着色器类型,应用程序程序员可以使用一种高级语言来自然地指定构成其渲染器的组件。目前,该着色器在 CPU 上执行,并在命令缓冲区记录之前执行。着色器的执行定义了图,之后,该图可以被执行,例如用于绘制单个帧。
着色器本身是用 RPSL(Render Pipeline Shading Language)编写的——这是一种专为实时渲染器紧凑而自然的规范而设计的语言。形式上,它是从 HLSL 派生出来的领域特定语言。此类着色器文件可以通过我们捆绑的 <span class=“pre”>rps-hlslc</span> 编译器进行编译,该编译器默认输出 C99 源文件;这样做是为了支持最广泛的目标平台。
如果您选择不使用 RPSL,也可以通过我们的 C API 构建渲染图,或者在其之上构建自定义前端。
教程概述
本教程将演示 RPS SDK 的关键 API 用法,非正式地介绍 RPSL,并解释 RPS 渲染图的构建方式和理解方式。它将分为一系列部分,分步展示 SDK 的不同功能。
本教程假定读者已经具备使用显式 API 编写图形应用程序的经验。因此,所有相关的示例都利用了预先准备好的 应用程序框架。教程部分将主要使用 DirectX 12 编写,并偶尔涉及 Vulkan 的术语。
教程部分
第一部分:Hello Triangle。
总结
- 创建 RPS 运行时设备。
- 创建 RPS 渲染图。
- 将节点绑定到渲染图。
- 更新图。
- 记录图命令。
- 销毁图。
- 销毁运行时设备。
第二部分:探索渲染图和 RPSL
总结
- 渲染图中的资源
- 资源类
- RPS 渲染图结构
- 渲染图构建阶段
- RPSL 资源管理器工具
- 渲染图的含义
- RPS 渲染图的工作原理
- 渲染图节点依赖
- 渲染图数据流模型
- 探索 RPSL
- 访问属性
- 访问属性参数
- 访问属性和排序保证
- 模块化 RPSL
- 调度工具
- HLSL 语义
- 访问属性
第三部分:RPS 与主机之间的互操作
总结
- 主机应用程序和 RPS 的数据互操作。
- 将成员回调函数绑定到节点。
- 在回调函数中检索通用参数和节点信息。
- 在回调函数中访问图形上下文绑定。
- 提前创建 Vulkan PSO。
- 参数自动解包到节点回调函数。
- 编写自定义解包器。
第四部分:RPS SDK 多线程指南
总结
- RPS SDK 多线程指南。
- 设置。
- 从多个线程提交命令。
- DirectX 12。
- 扩展我们的示例应用程序。
- Vulkan。
- 从多个线程记录渲染图。