Qual è l'uso principale di Vertex Buffer Objects?


8

Da quello che ho letto, sembra che i VBO siano puramente per le prestazioni.

Sto lavorando a un progetto di apprendimento molto rudimentale in lwjgl e sto solo cercando di capire quali funzioni più avanzate della libreria dovrei approfondire e quale sia il loro uso.

La mia comprensione è che i VBO consentono a una persona di mantenere i vertici in VRAM mentre non sono attualmente disegnati in una scena. Nel mio caso, sto solo disegnando quad e le prestazioni probabilmente non sono affatto una preoccupazione, ma sto cercando di mettere insieme ciò che sta accadendo sotto il cofano. Se sto disegnando quad direttamente, sto attingendo dalla memoria della CPU, giusto? Inoltre, se non sto facendo alcun controllo per la visibilità, ciò significa che sto rendendo assolutamente tutto nella "scena", indipendentemente dal fatto che sia in vista? I VBO sono un modo per archiviare oggetti e renderizzare solo ciò che è necessario?

Risposte:


10

Nota pedante: in OpenGL non esiste un "oggetto buffer vertice". Esistono semplicemente oggetti buffer . Un oggetto buffer è semplicemente un array lineare di memoria GPU che è possibile allocare, riempire con dati, leggere e utilizzare in vari modi. Una delle operazioni che è possibile eseguire con gli oggetti buffer è l'archiviazione dei dati dei vertici e il loro utilizzo come array di origine per il rendering. Ma hanno anche molti altri usi .

Gli oggetti buffer non sono un modo per evitare l'abbattimento del frustum o altri costrutti in stile grafico di scena. Se utilizzati per i dati dei vertici, gli oggetti buffer memorizzano semplicemente i dati dei vertici. Senza di loro, il tuoglDrawElements/Arrays/etc chiamate estrarranno i dati dagli array memorizzati nei buffer dei membri della CPU. Quando si utilizzano oggetti buffer per il rendering, le matrici vengono invece estratte dal contenuto dell'oggetto buffer.

La provenienza dei dati del vertice è l' unica differenza tra il rendering con oggetti buffer e il rendering senza di essi. Quindi niente abbattimento di frustum. Nessuna gestione del grafico di scena. Niente. Si tratta solo di dove sono archiviati i dati del vertice.


1
Potrei chiarire solo un po 'e menzionare che la vera ottimizzazione che fai usando i VBO è relativa al bus tra CPU e GPU, che è relativamente lento (e controverso). Se questa velocità del bus fosse trascurabile, non ci sarebbe praticamente alcuna differenza tra l'utilizzo di un VBO e l'utilizzo di un array di float sul lato CPU.
notlesh,

1
Vale anche la pena notare che il driver è libero di archiviare oggetti buffer dove vuole, anche nella memoria della CPU.
Massimo

A parte questo, costruire un VBO / VAO e semplicemente richiamare drawarrays su questo è (imho) più facile che dover eseguire il loop delle funzioni di pipeline fisse per tutti i vertici / facce. È come dire alla scheda grafica "vai su questa scatola di triangoli attraverso quello shader" invece di "Vai a prendere quel vertice, quel vertice e quello, e crea un bel triangolo felice laggiù. Ora prendi il prossimo ...". Oh, aspetta, ora sto entrando negli shader più dei VBO.
Exilyth,

2

I buffer di array OpenGL (= ciò che chiamiamo VBO) hanno un unico scopo: mantenere i dati della geometria all'interno della memoria GPU e non della memoria client, in modo da non dover inviare nuovamente ogni frame.

Così semplice :-)

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.