vulkan VkPipelineLayoutCreateInfo 的多个 setLayoutCounts 的目的是什么?

Jav*_*ang 2 vulkan

我想知道为什么可以在 VkPipelineLayoutCreateInfo 中指定多个描述符集布局,因为一个已经包含所有绑定。

Nic*_*las 6

描述符集布局描述了单个描述符集的布局。但是一个管道可以有多个描述符集。这就是layout(set = #)GLSL 中的限定符部分的含义:它指定该特定资源从哪个集合获取其描述符。的set是一个指数到VkPipelineLayoutCreateInfo::pSetLayouts阵列。该descriptor是索引描述符的该组的名单。他们两个结合起来标识管道布局内的特定描述符。

因此,您认为单个描述符集“已经包含所有绑定”的假设是不正确的。

如规范中所述,拥有多个描述符集的目的是允许用户更改一组描述符而不更改另一组,并允许管道部分布局相互兼容。

例如,您可能拥有每个场景的信息,例如灯光的位置和相机/投影矩阵。但是您可能还有每个对象的信息,例如矩阵。如果所有这些信息都在同一个描述符集中,那么如果您希望不同的对象具有不同的每个对象描述符集,那么它们在这些相同的集合中也必须具有不同的每个场景信息。

相反,您可以将它们拆分为单独的描述符集,集合 0(每个场景)中更改频率较低的信息和集合 1(每个对象)中更改频率较高的数据。这样,您不必为了更改每个对象的数据而更改每个描述符。

此外,您可以更改管道而无需恢复每个场景集。例如,假设您要从非蒙皮管道切换到蒙皮管道。嗯,很明显,它们具有根本不同类型的每个对象数据。但他们的每个场景数据是一样的。如果您在不同的描述符集中有这些数据,那么您不需要为每个场景数据设置另一个描述符。更改程序绑定时,您甚至不需要绑定新的 set 0。因为 set 0 与两个程序兼容,所以 set 0 的绑定在两个程序中都有效。

该规范甚至有一个专门关于这种情况的符号:

将最不频繁变化的描述符集放置在管道布局的开头附近,并将代表最频繁变化的资源的描述符集放置在靠近末尾的地方。切换管道时,仅需要更新已失效的描述符集绑定,而其余的描述符集绑定将保留在原位。