3d 我是否需要为每个缓冲区创建一个新的描述符集?

3d 我是否需要为每个缓冲区创建一个新的描述符集?,3d,vulkan,compute-shader,3d,Vulkan,Compute Shader,我不熟悉图形编程和Vulkan。 我知道我们需要将缓冲区绑定到描述符集,但我想知道我是否需要为我拥有的每个缓冲区创建一个新的描述符集,或者描述符集是否可以绑定2个或更多的缓冲区? 如果是,经验法则是什么?每个描述符集可能有多个相同或不同类型的资源。可以通过描述符集绑定的资源类型在描述符集布局中定义。在那里,通过VkDescriptorSetLayoutBinding结构,可以指定给定类型的资源(例如采样器、存储图像或统一缓冲区)以及作为着色器内的数组访问的此类资源的数量。但是,您也可以将同一类型

我不熟悉图形编程和Vulkan。 我知道我们需要将缓冲区绑定到描述符集,但我想知道我是否需要为我拥有的每个缓冲区创建一个新的描述符集,或者描述符集是否可以绑定2个或更多的缓冲区?
如果是,经验法则是什么?

每个描述符集可能有多个相同或不同类型的资源。可以通过描述符集绑定的资源类型在描述符集布局中定义。在那里,通过VkDescriptorSetLayoutBinding结构,可以指定给定类型的资源(例如采样器、存储图像或统一缓冲区)以及作为着色器内的数组访问的此类资源的数量。但是,您也可以将同一类型的多个资源指定为单独的布局条目(在布局创建期间指定的多个VkDescriptorSetLayoutBinding条目)。每个这样的描述符必须使用单独的、不同的绑定。并且必须在着色器内部使用相同的绑定才能访问给定的资源:

layout( set=S, binding=B ) uniform <variable_type> <variable_name>;
布局(set=S,binding=B)统一;

至于你问题的第二部分——视情况而定。每种情况、绘制的场景、渲染资源的类型、资源数量、内存使用情况,甚至图形硬件供应商都会影响渲染期间创建和绑定描述符集的方法。一般规则是,在渲染期间应尽量减少状态更改。因此,应尽量减少vkCmdBindDescriptorSets()函数调用的数量。但这限制了场景的灵活性和动态性。因此,在许多情况下,您需要更改描述符,或者同时使用多个描述符绑定多个描述符。但是,正如我所写的,这完全取决于给定的情况。

不,您不需要为每个资源设置单独的描述符

文件似乎清楚地说明了正在发生的事情。在同一章中,还有一个很好的代码示例演示了这一点

总而言之:

  • 您可以有一个单一描述符类型的(同质)数组
  • 您可以有几个“绑定”,每个“绑定”可以保存任何描述符类型的资源(或其数组)
  • 作为另一个间接层,您可以有几个描述符集,每个描述符集都有自己的绑定
经验法则可能是“少就是多”。如果不需要资源具有单独的类型或名称,请使用数组。如果不需要单独设置,请仅使用一个设置