Vedo che le versioni OpenGL 3 e successive eliminano l'uso del rendering lato client. La modalità immediata è stata eliminata e le matrici di vertici sembrano essere obsolete. Invece, se ho capito bene, i VBO sono il modo principale per il rendering dei vertici.
Mentre vedo la logica dietro avere un modo uniforme di rendere tutto, è vero che i VBO non hanno grandi svantaggi rispetto agli array di vertici? Pensavo che i VBO dovevano essere grandi buffer contenenti> 1 MB di dati, in generale. E se avessi una scena con molte geometrie più piccole? Ho un grafico di scena con un gran numero di nodi, ognuno dei quali ha bisogno della propria trasformazione, ecc. Ogni nodo dovrebbe anche essere in grado di essere eliminato separatamente, aggiunto separatamente, ecc. Prima stavo usando array di vertici. Quindi la mia prima domanda è se, se passerò ai VBO, ora ci sarà un overhead maggiore per i miei oggetti del grafico della scena perché un VBO deve essere allocato per ciascun oggetto.
Un'altra preoccupazione è che la geometria che sto visualizzando può essere altamente dinamica. Nel peggiore dei casi, ci possono essere momenti in cui è necessario inviare nuovamente ogni geometria a ogni frame per un certo periodo di tempo. I VBO avranno prestazioni peggiori rispetto agli array di vertici in questo caso d'uso, o i VBO nella peggiore delle ipotesi funzioneranno tanto quanto gli array di vertici ma non di più?
Quindi, in un formato più conciso, le mie domande sono:
1) Esiste un notevole sovraccarico nell'allocare / deallocare i VBO (intendo il semplice atto di creare un buffer)?
2) Se sto aggiornando i dati dalla CPU ogni frame, può essere sostanzialmente peggio che se avessi usato array di vertici?
E infine, vorrei sapere:
3) Se la risposta a una delle domande precedenti è "sì", perché deprecare altre modalità di rendering che potrebbero avere vantaggi rispetto ai VBO? C'è qualcosa che mi manca qui, come le tecniche che dovrei usare per mitigare alcuni di questi potenziali costi di allocazione, ecc.?
4) Le risposte a una di queste domande cambiano sostanzialmente a seconda della versione OpenGL che sto usando? Se refactoring il mio codice per essere compatibile con OpenGL 3 o 4 utilizzando VBO in modo performante, le stesse tecniche avranno probabilmente le stesse prestazioni con OpenGL 2 o è probabile che alcune tecniche siano molto più veloci con OpenGL 3 + e altri con OpenGL 2?
Ho posto questa domanda su overflow dello stack, ma sto ripubblicando qui perché ho realizzato che questo sito potrebbe essere più appropriato per la mia domanda.