管道如何知道在绑定描述符时使用哪个描述符布局?

How does the pipeline know which descriptor layout to use when binding descriptors?

调用 vkCmdBindDescriptorSets 时,我必须传递第一个集合的编号和我想要绑定的描述符集合数组。然后我可以使用 layout(set = X, binding = 0).

在我的着色器中使用我喜欢的任何一组

我的问题如下。集合的描述符集布局仅在创建描述符集时指定。然而,当我绑定时,我可以使用上述函数将任何描述符集绑定到任何集数。是否让我的着色器布局和绑定与管道创建期间指定的布局保持一致?否则,pipeline/shader 如何“知道”我的特定集合使用的布局?

在 Vulkan 中,除非另有说明,否则始终“由您决定”。这次也不例外。

如果您尝试 render/dispatch 使用没有匹配布局的管道和绑定描述符集,则会导致未定义的行为。

管道“知道”您使用的是哪种布局。布局的全部要点在于它“布置”了表示这些描述符如何组织的内部数据的排列。因此,“绑定 2”在实现用于定义的任何内部数据结构中的位置仅由布局决定。

布局因此有点像 C 或 C++ 中的结构。您不能将指向 B 类型结构的指针传递给需要指向 A 类型结构指针的函数。好吧,如果你做了一堆转换,你 可以 ,但是当函数访问那个指针时,会产生未定义的行为。

管道和绑定描述符集也是如此:它们必须使用兼容的布局,或者未定义的行为结果。