Ich habe Probleme, den konzeptionellen Unterschied zwischen einheitlichen Puffern und Push-Konstanten zu verstehen. Nach dem, was ich durch Lesen der Spezifikation feststellen kann, sind die Hauptunterschiede:
- Gleichmäßige Puffer können viel größer sein als Push-Konstanten.
- UBOs verwenden std140, PCs verwenden std430.
- UBOs können jederzeit mit vkCmdUpdateBuffer (oder Host-Mapping) aktualisiert werden und behalten ihre Werte bei, andernfalls müssen PCs für jeden Renderdurchlauf erneut gepusht werden. (Was mich überraschte - basierend auf dem Namen. Ich dachte, ich würde die Konstanten in der Pipeline buchstäblich aktualisieren und diese Änderungen beibehalten.)
In meinem Szenario habe ich Daten im Wert von ca. 200 Byte, von denen ich erwarte, dass sie größtenteils konstant sind . Das heißt, ich werde sie sehr selten ändern. Wäre es besser (unter der Annahme, dass die Größe dies zulässt) Push-Konstanten zu verwenden, obwohl ich sie in jedem Befehlspuffer erneut senden muss? Oder wäre es besser, ein 200-Byte-UBO zu verwenden und es nur selten mit vkCmdUpdatebuffer zu aktualisieren?
Ebenfalls. Was ist, wenn ich zB eine habe float random_seed
, die ich jedes Mal aktualisiere, wenn der Shader ausgeführt wird? Angenommen, ich habe bereits ein UBO, wäre es besser, dies mit dem UBO zusammenzufassen, obwohl der Rest des UBO konstant ist, oder würde ich einen Vorteil aus der Verwendung von Push-Konstanten für speziell diese Variable ziehen, damit ich dies vermeiden muss vkCmdUpdateBuffer vor jedem Renderdurchlauf?