首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在vulkan中什么是“推常量”?

在vulkan中什么是“推常量”?
EN

Stack Overflow用户
提问于 2018-06-21 04:19:32
回答 1查看 14.4K关注 0票数 30

我看了一大堆关于推常量的教程,提到了可能的好处,但我从来没有真正看到过,甚至在Vulkan文档中,“推常量”到底是什么……我不明白它们应该是什么,以及推常量的用途是什么。我能找到的最接近的是这个post,不幸的是,它没有询问它们是什么,但它们与另一个概念之间的区别是什么,对我没有太大帮助。

什么是推常量,它为什么存在,它是用来做什么的?它的名字是从哪里来的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 04:52:52

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

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

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

代码语言:javascript
复制
layout( push_constant ) uniform ColorBlock {
  vec4 Color;
} PushConstant;

从应用程序的角度来看,如果着色器要使用推常量,则必须在管道布局创建期间指定这些常量。则必须将vkCmdPushConstants()命令记录到命令缓冲器中。在其他函数中,此函数接受指向内存的指针,应从该内存复制推常量范围内的数据。

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

在Vulkan Cookbook的repository中有一个示例,显示了一个简单的push常量使用场景。Sascha Willems的Vulkan examples还包含一个示例,展示了如何使用推常量。

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50956414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档