Макет набора дескрипторов описывает макет для одного набора дескрипторов.Но конвейер может иметь несколько наборов дескрипторов.Вот что означает часть layout(set = #)
спецификатора в GLSL: он указывает, из какого набора этот конкретный ресурс получает свой дескриптор.set
- это индекс в массиве VkPipelineLayoutCreateInfo::pSetLayouts
.descriptor
- это индекс в списке дескрипторов этого набора.Два из них в совокупности идентифицируют конкретный дескриптор в макете конвейера.
Таким образом, ваше предположение, что один набор дескрипторов «уже включает в себя все привязки», неверно.
Как указано в спецификациисмысл в наличии множества наборов дескрипторов состоит в том, чтобы позволить пользователям изменять один набор дескрипторов без изменения другого, и чтобы конвейеры были частично совместимы по компоновке друг с другом.
Например, у вас может быть сценарийинформация, такая как расположение источников света и матрицы камеры / проекции.Но вы также можете иметь информацию по каждому объекту, например, матрицы.Если вся эта информация находится в одном и том же наборе дескрипторов, то, если вы хотите, чтобы разные объекты имели разные наборы дескрипторов для каждого объекта, они также должны иметь разную информацию для каждой сцены в тех же наборах.
Вывместо этого можно разделить их на отдельные наборы дескрипторов, с менее часто изменяющейся информацией в наборе 0 (для каждой сцены) и с более часто меняющимися данными в наборе 1 (для каждого объекта).Таким образом, вам не нужно изменять каждый дескриптор, просто чтобы изменить данные для каждого объекта.
Кроме того, вы можете изменять конвейеры без необходимости восстановления наборов для сцены.Например, предположим, что вы переходите от своего необожженного конвейера к своему очищенному конвейеру.Ну, очевидно, у них есть принципиально разные виды данных для каждого объекта.Но их данные для каждой сцены такие же .Если у вас есть эти данные в разных наборах дескрипторов, то вам не нужен другой набор дескрипторов для данных для каждой сцены.Вам даже не нужно связывать новый набор 0 при изменении привязки программы.Поскольку набор 0 совместим с обеими программами, привязка набора 0 действительна в обеих.
Спецификация даже имеет примечание конкретно об этом сценарии:
Поместите наименее часто меняющиеся наборы дескрипторовближе к началу макета конвейера и поместите наборы дескрипторов, представляющие наиболее часто изменяющиеся ресурсы, в концеПри переключении конвейеров необходимо будет обновить только привязки набора дескрипторов, которые были признаны недействительными, и оставшаяся часть привязок набора дескрипторов останется на месте.