2013-01-04 12 views
15

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?).

risposta

12

Sarebbe meglio avere un buffer con dimensioni fisse e non ricrearlo ogni frame.

È possibile raggiungere questo obiettivo:

  • creazione di buffer con dimensione massima, per lo spazio esempio per 1000 verts
  • aggiornamento solo l'inizio del buffer con nuovi dati. Quindi, se hai cambiato i dati per 500 verts, riempia la prima metà del buffer usando glMapBuffer
  • cambia il conteggio dei vertici disegnati durante il disegno. Ad esempio, è possibile utilizzare solo alcuni range di verts (ad esempio da 200 a 500) dall'intero buffer di 1000 VTS. Utilizzare glDrawArrays (modalità, prima, di conteggio)

idee da commenti:

  • glMapBufferRange e glBufferSubData potrebbero anche aiutare
  • considerano anche il doppio buffer di buffer

link: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html

speranza che l'aiuto s

+0

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

+1

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

+1

ecco alcuni link interessanti: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html, c'è anche una funzione glMapBufferRange che potrebbe aiutare. – fen

Problemi correlati