Render Pipeline Shaders SDK
Render Pipeline Shaders (RPS) SDK 为图形引擎提供了使用 Render Graphs 和显式 API 的框架。
我们很高兴地宣布,我们的 Render Pipeline Shaders (RPS) SDK 现已开放公开测试!
RPS SDK 是一个全面且可扩展的渲染图(Render Graph)框架,专为使用显式 API(如 DirectX® 12 和 Vulkan®)的图形应用程序和引擎而设计。
显式图形 API 的设计目的是减少命令录制开销,并在驱动 GPU 时实现更高的 CPU 并行度。由于其低级和状态较少的特性,诸如数据依赖性跟踪和同步之类的任务落到了 API 用户而非 GPU 驱动程序的肩上。
高效的瞬态内存管理也是一个重要方面。有状态的、按需生成的屏障和资源分配常常会导致性能不佳。
渲染图(也称为帧图或任务图)已被提议作为解决这些问题的优雅高效的方案。通过对整个帧及其各个通道(节点)之间的依赖关系进行概览,可以更有效地安排内存、屏障和工作负载。然而,在实践中,从头开始实现渲染图系统并非易事,并且需要不断努力才能使其在硬件、API 和内容不断演进的过程中保持最佳状态。在不同的渲染图系统之间移植效果和技术也可能耗费额外的工程时间。
RPS SDK 旨在使渲染图更易于访问,并提供一个普遍最优的屏障生成器和(别名)内存调度程序。它具有类似编译器的架构,包括用于指定资源和节点序列的前端,用于将线性节点序列编译成图并进行调度的运行时编译器,以及用于将计划好的渲染图转换为图形 API 命令的运行时后端。
RPS 还通过扩展 HLSL 的属性和内部函数来创建一个用于渲染图编程的领域特定语言,从而简化渲染图的构建。这允许通过高级的声明式编程模型隐式地指定渲染图,使用户能够专注于渲染管线逻辑而非节点配置细节。在节点声明时指定的访问属性和语义会在编译时(offline)转换为节点签名元数据,这些元数据可在运行时用于屏障生成、描述符创建和资源绑定。
// Node declarationsnode Triangle([readwrite(rendertarget)] texture renderTarget : SV_Target0);
// Sample RPSL codenode Upscale ([readwrite(rendertarget)] texture dest : SV_Target0, [readonly(ps)] texture source);
// Render Graph entry pointexport void hello_rpsl([readonly(present)] texture backBuffer){ // Declare a transient texture resource const ResourceDesc backBufferDesc = backBuffer.desc(); texture offscreen = create_tex2d(backBufferDesc.Format, uint(backBufferDesc.Width) / 2, uint(backBufferDesc.Height) / 2);
// Built-in clear node clear(offscreen, float4(0.0, 0.2, 0.4, 1.0));
// Render to offscreen texture with user defined "Triangle" node Triangle(offscreen);
// Blt offscreen to backbuffer with user defined "Upscale" node Upscale(backBuffer, offscreen);}在运行时,应用程序可以设置变量并执行 RPSL 代码(或构建渲染图的 C/C++ API 的用户回调函数),从而生成完全动态的渲染图。这将生成一个活动资源和节点的列表。资源和每节点数据可以在帧之间高效缓存。运行时编译器首先遍历列表,根据节点签名和参数数据解析节点依赖关系,并在必要时插入过渡节点,生成一个 DAG,然后将其传递给调度程序。默认调度程序根据各种因素(如屏障批处理、内存使用量和占用空间、输入节点排序、队列切换要求等)对 DAG 进行调度。它还提供一组标志来控制调度行为,例如强制程序顺序、优先节省内存占用(通过积极的别名)或优先最大化屏障批处理。RPSL 还支持一组用于精细控制的语言构造。
一个 RPS 调度的帧示例(底部),与真实游戏跟踪中的原始帧(顶部)相比

一个计划好的内存布局示例,显示在帧(X 轴)的事件中由别名资源复用的堆空间(Y 轴)
应用程序可以动态地将节点实现回调函数绑定到渲染图实例。后端可以处理 API 对象(如堆、资源和描述符)以及 Vulkan® 的 FrameBuffers 和 RenderPasses 的创建。在支持的情况下,它还可以绑定资源(目前支持绑定大多数非着色器资源),或设置视口和剪刀矩形等基本渲染状态。这减少了节点回调中的样板代码。
RPS 可以渐进地集成到引擎和应用程序中。通过自底向上的方法,它可以用来实现渲染器的仅一小部分模块,例如多通道后处理技术。通过自顶向下的方法,它可以作为帧的骨架,而每个节点都可以是独立的、多通道的技术。RPS 渲染图也是可组合的;例如,一个渲染图可以用作另一个渲染图中的节点。
完整的源代码现已在 GitHub 上提供,受存储库根目录中 `LICENSE.rtf` 文件中包含的 AMD 评估许可证约束。
如需在此公开测试期间获得支持,请联系您的 AMD 代表,或在 Twitter 上发送私信至 @GPUOpen 或 @GPUOpen@mastodon.gamedev.place。在公开测试期间,我们可能无法及时回复 Twitter 或 Mastodon 上的消息,但您的反馈仍然非常宝贵,我们会阅读并尽力回复每一位用户。