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

时间:2019-07-08 03:23:34

标签: vulkan

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

1 个答案:

答案 0 :(得分:0)

描述符集布局描述单个描述符集的布局。但是管道可以具有多个描述符集。这就是GLSL中限定符的layout(set = #)部分的含义:它指定此特定资源从其获取描述符的集合。 setVkPipelineLayoutCreateInfo::pSetLayouts数组的索引。 descriptor是该集合的描述符列表的索引。他们两个结合在一起,确定了管道布局中的特定描述符。

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

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

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

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

此外,您可以更改管道而不必还原每个场景集。例如,假设您正在从非皮肤管道切换到皮肤管道。好吧,很明显,他们具有根本不同的每种对象数据。但是他们的场景数据相同。如果这些数据位于不同的描述符集中,则无需为每个场景数据设置另一个描述符。更改程序绑定时,甚至不需要绑定新的0集。由于set 0与两个程序都兼容,因此set 0的绑定在两个程序中均有效。

规范甚至对此情况有专门的注释:

  

将最不频繁更改的描述符集放置在管道布局的开始附近,并将最频繁更改的描述符集放置在结尾附近。切换管道时,仅需要更新已失效的描述符集绑定,其余描述符集绑定将保留在原处。