Vulkan Cookbook 第七章 9 在着色器中使用推式常量(push constants)

 在着色器中使用推式常量(push constants)

译者注:示例代码点击此处

当我们向着色器提供数据时,通常使用uniform缓冲区,存储(storage)缓冲区或其他类型的描述符资源。 遗憾的是,更新此类资源可能不太方便,尤其是当我们需要提供频繁更改的数据时。

为此,引入了推式常量。 通过它们,我们可以通过更新描述符资源以简化和快速的方式提供数据。 但是,我们需要适应更小的可用空间。

在GLSL着色器中访问推送常量类似于使用统一缓冲区。

怎么做...

1.创建一个着色器文件。
2.定义uniform块:
    1.提供push_constant布局限定符:
        layout( push_constant )
    2.使用uniform限定符
    3.提供块的唯一名称
    4.在大括号内,定义一组统一变量
    5.指定块实例<instance name>的名称。
3.在void main()函数内部,使用块实例名称访问uniform变量:
    <instance name>.<variable name>

这个怎么运作...

按照与GLSL着色器中指定的uniform块类似的方式定义和访问推送常量,但是我们需要记住一些差异:
    1.我们需要在块的定义之前使用布局(push_constant)限定符
    2.我们必须为块指定实例名称
    3.我们每个着色器只能定义一个这样的块
    4.我们通过在名称前加上块的实例名来访问push常量变量:

 <instance name>.<variable name>

推送常量对于提供频繁更改的少量数据非常有用,例如转换矩阵或当前时间值 - 更新推送常量块应该比更新描述符资源(如uniform缓冲区)快得多。 我们只需要记住比描述符资源小得多的数据大小。 规范要求推送常量至少存储128个字节的数据。 每个硬件平台可以允许更多存储,但可能不会大得多。

提示:推送常量可以存储至少128个字节的数据。

在通过其提供颜色的片段着色器中定义和使用推式常量的示例可能如下所示:

#version 450 

layout( location = 0 ) out vec4 frag_color; 

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

void main() { 
  frag_color = PushConstant.Color; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值