我看了一大堆关于推常量的教程,提到了可能的好处,但我从来没有真正看到过,甚至在Vulkan文档中,“推常量”到底是什么……我不明白它们应该是什么,以及推常量的用途是什么。我能找到的最接近的是这个post,不幸的是,它没有询问它们是什么,但它们与另一个概念之间的区别是什么,对我没有太大帮助。
什么是推常量,它为什么存在,它是用来做什么的?它的名字是从哪里来的?
发布于 2018-06-21 04:52:52
推常量是一种为着色器快速提供少量统一数据的方法。它应该比UBO快得多,但一个巨大的限制是数据的大小-规范需要128字节才能用于推送常量范围。硬件供应商可能支持更多,但与其他方法相比,它仍然很少(例如256字节)。
因为推常量比其他描述符(我们通过其向着色器提供数据的资源)快得多,所以它们可以方便地用于在绘制调用之间更改的数据,例如变换矩阵。
从着色器的角度来看,它们是通过layout( push_constant )限定符和统一数据块来声明的。例如:
layout( push_constant ) uniform ColorBlock {
vec4 Color;
} PushConstant;从应用程序的角度来看,如果着色器要使用推常量,则必须在管道布局创建期间指定这些常量。则必须将vkCmdPushConstants()命令记录到命令缓冲器中。在其他函数中,此函数接受指向内存的指针,应从该内存复制推常量范围内的数据。
给定管线的不同着色器阶段可以使用相同的推常数块(类似于UBO)或整个范围的较小部分。但是,重要的是,每个着色器阶段只能使用一个推常数块。不过,它可以包含多个成员。另一件重要的事情是,总数据大小(跨使用推常量的所有着色器阶段)必须符合大小约束。因此,约束不是每个阶段,而是整个范围。
在Vulkan Cookbook的repository中有一个示例,显示了一个简单的push常量使用场景。Sascha Willems的Vulkan examples还包含一个示例,展示了如何使用推常量。
https://stackoverflow.com/questions/50956414
复制相似问题