Использование нескольких DescriptorSet вместо большего количества обновлений Uniform

Я только начал изучать vulkan и просмотрел несколько туториалов/примеров и кое-что замечаю: все используют 1 структуру для равномерной загрузки, содержащую все соответствующие данные (модель, вид, проекционная матрица и т.д.). Эти структуры обновляются каждый кадр ПОЛНОСТЬЮ.

Теперь мой вопрос: это потому, что авторы были «ленивыми» и вместо создания отдельных форм для отдельных частот (например, проекции, поскольку ее нужно загрузить только один раз) они просто использовали 1 структуру, потому что она не требует дополнительной настройки, или это потому, что производительность лучше при загрузке 1 «большой» структуры чаще, чем при создании нескольких наборов.


person Dynamitos    schedule 22.08.2016    source источник
comment
Я могу говорить только о своих примерах, а те, которые я стараюсь сделать простыми (насколько это возможно с Vulkan). Вот почему я использую только один набор дескрипторов для каждого UBO. Пример, демонстрирующий несколько наборов, есть в моем списке, но он еще не закончен. Но обратите внимание, что для чего-то столь статичного, как проекционная матрица, вы можете использовать push-константы вместо выделенного DS.   -  person Sascha Willems    schedule 22.08.2016
comment
@SaschaWillems, это были ваши примеры (и примеры Александра Оверворда), на которые я ссылался. На первый взгляд они довольно чудовищны, но если вы читаете код, они довольно просты. Они очень помогли начать работу с vulkan, поэтому я хочу лично поблагодарить вас за предоставленные примеры. Спасибо   -  person Dynamitos    schedule 22.08.2016


Ответы (1)


Большинство демонстрационных/примерных кодов ленивы. Обычно это делается для того, чтобы избежать чрезмерного усложнения кода концепциями, которые не нужны для получения результата.

Кроме того, демо обычно имеют 1 вызов отрисовки (рендеринг только одной модели), поэтому в них нет необходимости менять наборы дескрипторов.

Также частота изменения находится в пределах записи одного командного буфера. Поэтому, если у вас есть матрица просмотра, которая будет оставаться постоянной на протяжении всего кадра, вы можете поместить ее в начало макета вместе с матрицей проекции.

person ratchet freak    schedule 22.08.2016
comment
под стартом макета ты имеешь в виду начало рендерпасса? в любом случае, спасибо - person Dynamitos; 22.08.2016
comment
Нет, я имею в виду номер привязки 0, который затем используется (почти) со всеми вызовами отрисовки в командном буфере. - person ratchet freak; 22.08.2016
comment
У меня есть последний вопрос: если шейдеры станут больше с большим количеством переменных (10-20), вы начнете создавать другие буферы или по-прежнему будете придерживаться простого подхода с одним буфером и пуш-константами? - person Dynamitos; 22.08.2016
comment
@Dynamitos, если эти переменные связаны (всегда изменяются вместе), я бы предпочел, чтобы они были в одном дескрипторе. - person ratchet freak; 22.08.2016