为什么VkShaderStageFlagBits是一个位掩码?

ned*_*edb 4 graphics bit-manipulation bitmask bit vulkan

在Vulkan中,您可以指定结构的VkPipelineShaderStageCreateInfo's' VkGraphicsPipelineCreateInfo,并且可能VkPipelineShaderStageCreateInfo每个着色器阶段应该有一个(例如顶点和片段着色器).

那么为什么stage类型的字段字段恰好是vkShaderStageFlagBits因为它更接近于某种Vulkan约定呢?

我的困惑是我被引导相信你以这种方式使用Bitmask的唯一原因是,如果你需要将位组合在一起.(例如,对于flags所有Vulkan结构中的一般字段).我试图找到答案,所以我查看了Vulkan Spec,这让我更加困惑!这是因为它们有两位VK_SHADER_STAGE_ALL_GRAPHICS,VK_SHADER_STAGE_ALL这些位被定义为:

VK_SHADER_STAGE_ALL_GRAPHICS是用作速记的位组合,用于指定上面定义的所有图形阶段(不包括计算阶段).

VK_SHADER_STAGE_ALL是用作速记指定由该装置支持的所有着色器阶段,包括其通过扩展引入的所有附加的级位的组合.

好吧,如果他们应该是"速记"来指定所有位,这是否意味着一个着色器阶段,应该能够代表所有阶段的版本?

提前致谢!

Sas*_*ems 5

确切地说,这主要是为了保持api的一致性.VkShaderStageFlagBits用于多个位,其中位掩码比管道创建时更有意义.

有意义的示例是描述符集布局绑定,您可以使用标志掩码指定哪些阶段可以访问您的描述符(采样器,统一缓冲区对象等).

所以,如果你想要一个UBO从顶点和片段阶段,从几何和细分阶段另一个访问你建立的时候使用不同的阶段标志位的组合VkDescriptorSetLayoutBinding.流水线状态组合在这里很常见.

  • 啊哈,明白了,因为我还没有了解流水线布局或描述符集。感谢您的样品;)!! (2认同)