Faccio fatica a capire la differenza concettuale tra buffer uniformi e costanti push. Da quello che posso raccogliere leggendo le specifiche, le differenze principali sono:
- I buffer uniformi possono essere molto più grandi delle costanti push.
- Gli UBO usano std140, i PC usano std430.
- Gli UBO possono essere aggiornati in qualsiasi momento con vkCmdUpdateBuffer (o mappatura host) e persistono i loro valori in caso contrario, i PC devono essere rinviati per ogni passaggio di rendering. (Il che mi ha sorpreso - in base al nome. Pensavo che avrei letteralmente aggiornato le costanti nella pipeline sul posto e che quei cambiamenti persistessero)
Nel mio scenario, ho circa ~ 200 byte di dati che mi aspetto siano per lo più costanti . Cioè, li cambierò molto raramente. Sarebbe meglio (supponendo le dimensioni consentite) usare le costanti push anche se devo rispedirle in ogni buffer di comando? O sarebbe meglio usare un UBO a 200 byte e aggiornarlo di rado con vkCmdUpdatebuffer?
Anche. cosa succede se ho, ad esempio, un float random_seed
aggiornamento che aggiornerò ogni volta che lo shader viene eseguito? Supponendo che io abbia già un UBO, sarebbe meglio raggrupparlo con l'UBO, anche se il resto dell'UBO è costante, o trarrebbe beneficio dall'uso delle costanti push in particolare per questa variabile, quindi posso evitare di dover vkCmdUpdateBuffer prima di ogni passaggio di rendering?