Нужно ли создавать новый набор дескрипторов для каждого буфера?

Я новичок в графическом программировании и Vulkan. Я понимаю, что нам нужно привязать буфер к набору дескрипторов, но мне интересно, нужен ли мне новый набор дескрипторов для каждого имеющегося у меня буфера, или я могу descriptorSet связать 2 или более буферов? Если да, то каково эмпирическое правило для этого?


person Clmelissa    schedule 10.10.2017    source источник


Ответы (2)


Каждый набор дескрипторов может иметь несколько ресурсов одного или разных типов. Какой тип ресурсов может быть связан через набор дескрипторов, определяется в макете набора дескрипторов. Там через структуру VkDescriptorSetLayoutBinding вы указываете данный тип ресурса (например, сэмплер, изображение хранилища или юниформ-буфер) и количество ресурсов этого типа, к которым осуществляется доступ в виде массива внутри шейдера. Но вы также можете указать несколько ресурсов одного типа в виде отдельных записей макета (несколько записей VkDescriptorSetLayoutBinding, указанных при создании макета). Каждый такой дескриптор должен использовать отдельную привязку. И такая же привязка должна использоваться внутри шейдера для доступа к данному ресурсу:

layout( set=S, binding=B ) uniform <variable_type> <variable_name>;

Что касается второй части Вашего вопроса - это зависит. Каждая ситуация, нарисованная сцена, тип визуализируемых ресурсов, количество ресурсов, использование памяти, даже поставщик графического оборудования влияют на подход, используемый для создания и связывания наборов дескрипторов во время рендеринга. Общее правило заключается в том, что вы должны свести к минимуму изменения состояния во время рендеринга. Таким образом, количество вызовов функции vkCmdBindDescriptorSets() должно быть как можно меньше. Но это ограничивает как гибкость, так и динамику Вашей сцены. Таким образом, существует много ситуаций, в которых вам нужно будет изменить дескрипторы или связать несколько дескрипторов одновременно, каждый с несколькими дескрипторами. Но, как я уже писал, все зависит от конкретной ситуации.

person Ekzuzy    schedule 10.10.2017

Нет, вам не нужен отдельный набор дескрипторов для каждого ресурса.

Документация VkDescriptorSetLayout, кажется, ясно дает понять, что это происходит. В той же главе есть хороший пример кода, демонстрирующий это.

Итак, подводя итог:

  • Вы можете иметь (однородный) массив одного типа дескриптора
  • У вас может быть несколько «привязок», каждая из которых может содержать любой ресурс типа дескриптора (или их массив)
  • И в качестве еще одного уровня косвенности вы можете иметь несколько наборов дескрипторов, каждый со своими привязками.

Эмпирическое правило, вероятно, "меньше больше". Если вам не нужны ресурсы с отдельными типами или именами, используйте array. Если вам не нужен отдельный набор, используйте только один набор.

person krOoze    schedule 10.10.2017