Quando utilizzare un array di vertici e quando utilizzare un VBO?


14

Sto cercando di conoscere le matrici di vertici e gli oggetti buffer di vertici , ma non capisco le differenze in termini di:

  • caso d'uso (geometria statica come terreni, geometria che cambia ogni telaio come un sistema di particelle, ecc.)
  • prestazione
  • portabilità (vecchia scheda grafica, console, dispositivi come Android o iPhone, ecc.)

alcuni chiarimenti?


3
Per chiunque altro che arriva qui, controlla le più votato risposta qui .... stackoverflow.com/questions/430555/...
afuzzyllama

Risposte:


14

Ecco un discreto commento sui VBO.

Prestazione

Ecco una buona panoramica della semantica chiamante.

Ecco un'altra buona panoramica dei problemi di prestazioni; in esso vediamo che i VBO sono più performanti degli array.

Il motivo per cui preferiamo i VBO è che i dati vengono caricati sulla scheda, quindi non è necessario trasferirli su ogni frame. A seconda del tipo di VBO creato, è possibile fornire suggerimenti sul driver grafico sull'utilizzo (write-many, read-many vs. write-many, never-read, ecc.).

uso

I VBO sono davvero buoni per la geometria statica come il terreno che non ti aspetti di cambiare, o per la geometria istanziata.

Le matrici di vertici sono utili per i dati che cambiano frequentemente ma che vengono letti anche dalla macchina host, quindi per il rendering diretto dei dati che vengono manipolati (i buffer di dati del telemetro laser, ad esempio, sono dove li ho usati frequentemente). Se riesci a cavartela senza mai leggere i dati sul dispositivo host (quindi, semplicemente spingendoli fuori sulla scheda), i VBO in modalità di sola scrittura sono una buona opzione.

portabilità

Array di vertici lato client Questi sono disponibili in OpenGL prima della 3.0, deprecati in 3.0 e passati in 3.1+. OpenGL ES li supporta (OpenGL ES 2 no).

VBO Questi sono disponibili dopo OpenGL 1.5. Questi sono gli unici modi per memorizzare i dati della geometria in OpenGL ES 2 (e così, WebGL).


2
In quel PerformanceTuning.pdf, afferma che i VBO "possono danneggiare le prestazioni in casi non ottimali" ... ma non elaborano. Qualche idea di quali siano questi casi? Ho un caso in cui ho bisogno di aggiornare la geometria ogni frame, quindi mi chiedo se un array di vertici sarebbe migliore o peggiore di un VBO in quel caso. Grazie.
sidewinderguy

1
leggi opengl.org/sdk/docs/man/xhtml/glDrawElements.xml e opengl.org/wiki/GlDrawElements - Gli array di vertici NON SONO deprecati né rimossi, sono ancora supportati da OpenGL 4.x;

1
@vaxquis Gli array di vertici lato client sono obsoleti. Le matrici di vertici lato server non lo sono. I VAO sono cose diverse e hanno lo scopo di salvare lo stato. Nulla era sbagliato nel post, anche se potrebbe essere più preciso se affermasse sul lato client. Ma immagino fosse implicito.
concept3d

1
"Gli array di vertici lato client sono obsoleti. Gli array di vertici lato server non lo sono." "Array di vertici Questi sono disponibili in OpenGL prima di 3.0, deprecati in 3.0 e passati in 3.1+." "puoi prespecificare matrici separate di vertici (...) e usarle per costruire una sequenza di primitive con una sola chiamata a glDrawElements. Core nella versione 4.4" - Vedo contraddizione in queste affermazioni.

2
Inoltre, prima di dire qualcosa "è deprecato", specifica la fonte di tale affermazione, preferibilmente nel documento ufficiale. Indicare da StackExchange a StackOverflow come una prova NON è il modo in cui la scienza funziona, e difendere con "Immagino che fosse implicito" non è un argomento. Nessuno ha fatto domande sugli array client / server, la domanda riguardava l'array di vertici in senso lato, rispetto al VBO. A proposito, non ho detto nulla su VAO, da dove viene l'idea?

11

(Sto aggiungendo questo qui a causa del fatto che la risposta di ChrisE è altamente ambigua, il che è purtroppo dovuto all'ambiguità della domanda originale. Tuttavia presumo che la domanda del PO avrebbe dovuto essere intitolata "quando usare i VAO e quando usare i VBO ".)

V ertex B uffer O bjects (che in realtà non sono dissimili da altri tipi di B uffer O bjects, ad esempio U niform B uffer O bjects) forniscono un mezzo per caricare i dati del vertice nell'hardware grafico.

V Ertex Un RRay O bjects vengono utilizzati in aggiunta ai VBO s per migliorare lato client (CPU-side) prestazioni, riducendo il numero di chiamate necessarie per rilegare singoli buffer di vertici e ri-insieme dei vertici attributi ogni volta che si desidera cambia per renderizzare in un certo modo. Invece di fare tutto ciò che funziona su ogni fotogramma, lo fai una volta (all'inizializzazione), quindi ricollega semplicemente il VAO appropriato per ogni (set di) richiamo (i) che utilizza gli attributi di vertice associati.

Nonostante ciò, l'utilizzo di VAO non ti libera dall'ulteriore responsabilità di dover fare glBindBuffer+glBufferData per qualsiasi dato che cambi ogni frame, ad esempio posizioni / rotazioni / matrici delle entità di gioco. È solo quando hai dati completamente statici che devi fare solo glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)per il rendering.


+1 VAO è un nome terribile e confuso, e mi ricorda sempre che cosa è diventato un pasticcio openGL.
concept3d

1
Ricordo anche di aver discusso di questa domanda (la maggior parte è stata cancellata). Ancora una volta il problema è con l'orribile terminologia di OpenGL. Ho anche modificato la risposta di Chris per essere più accurato.
concept3d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.