什么是vulkan中的“推动常数”?

时间:2018-06-20 20:19:32

标签: vulkan

我看了一堆有关推常量的教程,暗示了可能的好处,但是我从未真正看到过,即使在Vulkan文档中,“推常量”到底是什么...我不知道不了解它们应该是什么以及推常量的目的是什么。我能找到的最接近的东西是这个post,不幸的是,它并没有询问它们是什么,但是它们与另一个概念之间的区别是什么,对我没有多大帮助。

什么是推常数,为什么它存在以及其用途是什么?名称从何而来?

1 个答案:

答案 0 :(得分:7)

推常量是一种快速向着色器提供少量统一数据的方法。它应该比UBO快得多,但是一个巨大的限制是数据大小-规范要求128个字节可用于推送常量范围。硬件供应商可能会支持更多,但是与其他方式相比,它仍然很少(例如256字节)。

因为推入常量比其他描述符(我们通过其向着色器提供数据的资源)要快得多,所以它们方便用于在绘制调用之间进行更改的数据,例如变换矩阵。

从着色器角度来看,它们是通过layout( push_constant )限定符和一组统一数据声明的。例如:

layout( push_constant ) uniform ColorBlock {
  vec4 Color;
} PushConstant;

从应用程序角度来看,如果着色器要使用推常量,则必须在创建管道布局时指定它们。然后必须将vkCmdPushConstants()命令记录到命令缓冲区中。除其他功能外,此函数使用指向内存的指针,应从该指针复制到推送常量范围的数据。

给定管道的不同着色器阶段可以使用相同的推常数块(类似于UBO)或整个范围的较小部分。但是,重要的是,每个着色器阶段只能使用一个推入常量块。但是,它可以包含多个成员。另一个重要的事情是,总数据大小(在所有使用推常量的着色器阶段中)必须适合大小约束。因此约束不是每个阶段而是整个范围。

Vulkan Cookbook的repository中有一个示例显示了一个简单的推送常量使用方案。 Sascha Willems的Vulkan examples还包含一个示例,显示了如何使用推常量。