Vulkan:描述符集兼容性

时间:2019-01-18 14:05:54

标签: vulkan

在Vulkan规范的“描述符集绑定”一章中,进行了以下声明:

  

在记录绘制或分配命令以使用该管道执行时,必须为管道中任何着色器访问的所有设定编号绑定一个兼容的描述符集。

在哪里定义了“兼容描述符”?我尚未在规范中找到定义。我想知道描述符集是否必须与着色器中的集布局完全匹配,或者是否允许描述符集将资源绑定到着色器中不存在的绑定点。

该问题的原因如下:假设我有两个几乎相同的着色器(考虑它们是模板着色器的“变体”),它们具有相同的布局,只是其中一个不使用一个特定的绑定点(例如,这可能是“快速路径”,由#ifdef从通用路径派生而来,从而使一个绑定点被优化了)。假定我有两个绘制调用,第一个使用一个着色器,第二个使用另一个着色器,并假定所需资源相同,只是该着色器有一个具有特殊绑定点的附加资源。还要假设我使用相同的描述符集布局,该布局正好映射到具有附加绑定点的一个着色器。在这种情况下,我希望为两个着色器使用相同的描述符集,以减少描述符集的更新/绑定数。该集合将与一个着色器完全匹配,并且将包含另一个着色器中不存在的资源绑定。

1 个答案:

答案 0 :(得分:1)

着色器没有布局; 管道具有布局。在构建管道时,VkPipelineLayout必须在某种程度上与着色器中定义的内容一致。

也就是说,着色器声明的资源必须与VkPipelineLayout指定的资源匹配。但是,管道布局还可以定义该管道中的着色器使用的其他资源。

使用管道渲染时绑定的描述符集必须与为该管道定义的描述符集布局完全匹配(您可以为高于该管道使用的最高集的集绑定描述符,但是所有绑定到由该管道使用的最高集的集管道必须匹配)。因此,如果您想做您想做的事情,只需为两个管道设置相同的布局即可。