В главе «Привязка набора дескрипторов» спецификации Vulkan делается следующее утверждение:
Совместимый набор дескрипторов должен быть привязан ко всем номерам наборов, к которым имеют доступ любые шейдеры в конвейере, во время записи команды рисования или отправки для выполнения с использованием этого конвейера.
Где определяется «совместимый дескриптор»? Я не нашел определения в спецификации. Интересно, должен ли набор дескрипторов точно соответствовать макету набора в шейдере или разрешено ли набору дескрипторов иметь ресурс, привязанный к точке привязки, которая не существует в шейдере.
Причина этого вопроса заключается в следующем: предположим, что у меня есть два почти идентичных шейдера (считайте их «вариациями» шаблонного шейдера), у них одинаковые макеты, за исключением того, что один из них не использует одну конкретную точку привязки (т. Е. это может быть «быстрый путь», полученный из общего пути с помощью #ifdef, что приводит к оптимизации одной точки привязки). Предположим, у меня есть два вызова отрисовки, первый с использованием одного шейдера, а второй с использованием другого, и предполагаем, что требуемые ресурсы идентичны, за исключением того, что есть дополнительный ресурс для этого шейдера, который имеет эту специальную точку привязки. Также предположим, что я использую тот же макет набора дескрипторов, который точно соответствует тому шейдеру, который имеет дополнительную точку привязки. В этой ситуации я бы предпочел использовать один и тот же набор дескрипторов для обоих шейдеров, чтобы уменьшить количество обновлений / привязок наборов дескрипторов. Набор будет точно соответствовать одному шейдеру и будет содержать привязку ресурса, которой нет в другом шейдере.