Qual é o uso principal dos Vertex Buffer Objects?

8

Pelo que li, parece que os VBOs são puramente para desempenho.

Estou trabalhando em um projeto de aprendizado muito rudimentar no lwjgl e só estou tentando descobrir em quais recursos mais avançados da biblioteca devo me aprofundar e qual é a utilidade deles.

Meu entendimento é que os VBOs permitem que uma pessoa mantenha vértices na VRAM enquanto ela não está sendo desenhada em uma cena. No meu caso, estou apenas desenhando quads e o desempenho provavelmente não é uma preocupação, mas estou tentando entender o que está acontecendo sob o capô. Se estou desenhando quads diretamente, estou desenhando na memória da CPU, correto? Além disso, se não estou verificando a visibilidade, isso significa que estou processando absolutamente tudo na "cena", independentemente de estar em exibição? Os VBOs são uma maneira de armazenar objetos e renderizar apenas o necessário?

sensae
fonte

Respostas:

10

Nota pedante: Não existe no OpenGL algo como um "Vertex Buffer Object". Existem simplesmente objetos de buffer . Um objeto de buffer é simplesmente uma matriz linear de memória da GPU que você pode alocar, preencher com dados, ler e usar de várias maneiras. Uma das coisas que você pode fazer com objetos de buffer é armazenar dados de vértices neles e usá-los como matrizes de origem para renderização. Mas eles têm muitos outros usos também .

Objetos de buffer não são uma maneira de evitar a seleção de frustum ou outras construções no estilo de gráfico de cena. Quando usados ​​para dados de vértice, os objetos de buffer simplesmente armazenam dados de vértice. Sem eles, suas glDrawElements/Arrays/etcchamadas extrairão dados de matrizes armazenadas nos buffers de membros da CPU. Ao usar objetos de buffer para renderização, as matrizes são extraídas do conteúdo do objeto de buffer.

De onde vêm os dados do vértice é a única diferença entre renderizar com objetos de buffer e renderizar sem eles. Portanto, nenhum frustum selecionando. Sem gerenciamento de gráfico de cena. Nada. É exatamente onde seus dados de vértice são armazenados.

Nicol Bolas
fonte
11
Devo esclarecer um pouco e mencionar que a otimização real que você faz usando VBOs se refere ao barramento entre a CPU e a GPU, que é relativamente lenta (e contenciosa). Se essa velocidade do barramento fosse insignificante, não haveria praticamente nenhuma diferença entre usar um VBO e usar uma matriz de flutuadores no lado da CPU.
Novelas
11
Também é importante notar que seu driver é livre para armazenar objetos de buffer onde quiser, inclusive na memória da CPU.
Maximus Minimus
Além disso, criar um VBO / VAO e apenas chamar drawarrays é mais fácil do que ter que executar um loop de funções de pipeline fixas para todos os vértices / faces. É como dizer à placa de vídeo "vá correr esta caixa de triângulos através desse sombreador" em vez de "vá pegar esse vértice, aquele vértice e isso, e faça um belo triângulo feliz por lá. Agora pegue o próximo ...". Oh, espere, agora estou entrando em shaders mais que em VBOs.
Exilyth 27/11
2

Os buffers de matriz OpenGL (= o que chamamos de VBO) têm um único objetivo: manter seus dados geométricos dentro da memória da GPU e não da memória do cliente, para que você não precise reenviá-lo a cada quadro.

Tão simples como isso :-)

Kos
fonte