Я пытаюсь понять концептуальную разницу между унифицированными буферами и константами push. Из того, что я могу почерпнуть, прочитав спецификацию, основные отличия:
- Однородные буферы могут быть намного больше, чем константы push.
- UBO используют std140, ПК используют std430.
- UBO могут быть обновлены в любое время с помощью vkCmdUpdateBuffer (или сопоставления хоста) и сохраняют свои значения, в противном случае ПК необходимо повторно выдвигать для каждого прохода рендеринга. (Что меня удивило - основываясь на названии. Я думал, что буквально буду обновлять константы в конвейере на месте, и эти изменения сохранятся)
В моем сценарии у меня есть данные размером ~ 200 байтов, которые, как я ожидаю, будут в основном постоянными . То есть я буду менять их очень редко. Было бы лучше (при условии, что размер разрешает) использовать константы push, даже если мне нужно повторно отправлять их в каждый буфер команд? Или лучше использовать 200-байтовый UBO и редко обновлять его с помощью vkCmdUpdatebuffer?
Также. что если у меня есть, например, то, float random_seed
что я буду обновлять каждый раз при запуске шейдера? Предполагая, что у меня уже есть UBO, было бы лучше объединить это с UBO, даже если остальная часть UBO постоянна, или я бы получил выгоду от использования констант push для конкретно этой переменной, поэтому я могу избежать необходимости vkCmdUpdateBuffer перед каждым проходом рендеринга?