Sto utilizzando OpenGL
per implementare una sorta di disegno batch. Per questo creo un vertex buffer
per memorizzare i dati.OpenGL. Aggiornamento del buffer dei vertici con glBufferData
Nota: questo buffer generalmente si aggiornerà su ciascun frame, ma non diminuirà mai le dimensioni (ma può comunque aumentare).
La mia domanda è: è tecnicamente corretto utilizzare glBufferData
(con s treaming write-only mode
) per aggiornarlo (anziché ad esempio glMapBuffer
)? Suppongo che non sia necessario mapparlo, dal momento che i dati completi vengono aggiornati, quindi invio semplicemente un pacchetto completo in una volta. E se la dimensione del buffer corrente è inferiore a quella che sto inviando, aumenterà automaticamente, vero? Sono solo ora sicuro del modo in cui funziona davvero (forse creerà buffer su ogni chiamata, no?).
Grazie per la risposta! Ma questa era una cosa un po 'diversa: impossibile creare un buffer di dimensioni massime. Ma la probabilità di cambiare le sue dimensioni è incredibilmente bassa, quindi ora è un problema. Per quanto riguarda le gamme di disegni, è quello che faccio ora. Ma posso fare una domanda sulla tua seconda opzione (per aggiornare solo un range di verts): in questo caso ho sempre i miei dati memorizzati in un blocco continuo (su CPU), in modo che possa semplicemente aggiornare un buffer con lo stesso glBufferData , ma con dimensioni più piccole specificate - lo stesso risultato? Non rovinerà il buffer o lo ricrea? Grazie – Celestis
Sicuramente otterrai prestazioni migliori tra GPU/CPU lasciando cadere un buffer per ogni frame e crearne uno nuovo? L'aggiornamento di un buffer che potrebbe essere in uso non comporterà alcun potenziale blocco, se la GPU lo sta attualmente utilizzando? – Robinson
ecco alcuni link interessanti: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html, c'è anche una funzione glMapBufferRange che potrebbe aiutare. – fen