Quando usar uma matriz de vértices e quando usar um VBO?


14

Estou tentando aprender sobre matrizes de vértices e objetos de buffer de vértices , mas não entendo as diferenças em termos de:

  • caso de uso (geometria estática como terrenos, geometria que altera todos os quadros como um sistema de partículas, etc.)
  • desempenho
  • portabilidade (placa gráfica antiga, consoles, dispositivos como Android ou iPhone etc.)

alguns esclarecimentos?


3
Para qualquer pessoa que chegue aqui, confira a resposta mais votada aqui .... stackoverflow.com/questions/430555/…
afuzzyllama

Respostas:


14

Aqui está um artigo decente sobre VBOs.

atuação

Aqui está uma boa visão geral da semântica de chamada.

Aqui está outra boa visão geral dos problemas de desempenho; nele vemos que os VBOs são mais eficientes que os arrays.

A razão pela qual preferimos VBOs é que os dados são carregados no cartão e, portanto, você não precisa transferi-lo para todos os quadros. Dependendo do tipo de VBO criado, você pode fornecer dicas ao driver gráfico sobre o uso (escrever muitos, ler muitos vs. escrever muitos, nunca ler, etc.).

Uso

Os VBOs são realmente bons para geometria estática, como terrenos que você não espera mudar, ou para geometria instanciada.

As matrizes de vértice são boas para dados que mudam com frequência, mas que também são lidos pela máquina host - portanto, para renderizar diretamente os dados que estão sendo manipulados (os buffers de dados do telêmetro a laser, por exemplo, são onde eu os usei) com frequência. Se você conseguir nunca ler os dados no dispositivo host (basta empurrá-los para o cartão), os VBOs no modo somente gravação são uma boa opção.

Portabilidade

Matrizes de vértices do lado do cliente Elas estão disponíveis no OpenGL anterior à 3.0, obsoletas na 3.0 e foram substituídas na versão 3.1+. O OpenGL ES os suporta (o OpenGL ES 2 não).

VBOs Estes estão disponíveis após o OpenGL 1.5. Essa é a única maneira de armazenar dados de geometria no OpenGL ES 2 (e, portanto, WebGL).


2
Nesse PerformanceTuning.pdf, ele diz que os VBOs "podem prejudicar o desempenho em casos não ideais" ... mas não são elaborados. Alguma idéia de quais são esses casos? Eu tenho um caso em que preciso atualizar a geometria a cada quadro, por isso estou me perguntando se uma matriz de vértices seria melhor ou pior que uma VBO nesse caso. Valeu.
sidewinderguy

1
leia opengl.org/sdk/docs/man/xhtml/glDrawElements.xml e opengl.org/wiki/GlDrawElements - Matrizes de vértices NÃO são obsoletas nem removidas, elas ainda são suportadas no OpenGL 4.x; A verdade dos factos, companheiro, porque o que você está espalhando desinformação é apenas

1
@vaxquis As matrizes de vértices do lado do cliente foram descontinuadas. Matrizes de vértices do lado do servidor não são. VAOs são coisas diferentes e destinam-se a salvar o estado. Nada estava errado na postagem, mas poderia ser mais preciso se declarar o lado do cliente. Mas acho que isso estava implícito.
precisa saber é o seguinte

1
"Matrizes de vértices do lado do cliente estão obsoletas. Matrizes de vértices do lado do servidor não são." "Matrizes de vértices Elas estão disponíveis no OpenGL anteriores à 3.0, obsoletas na 3.0 e incluídas na versão 3.1+". "você pode pré-especificar matrizes separadas de vértices (...) e usá-las para construir uma sequência de primitivas com uma única chamada para glDrawElements. Núcleo na versão 4.4" - Vejo contradição nessas declarações.

2
Além disso, antes de dizer que algo "está obsoleto", especifique a fonte dessa declaração, de preferência no documento oficial. Apontar do StackExchange para o StackOverflow como prova NÃO é a maneira como a ciência funciona, e defender com "Acho que isso estava implícito" não é um argumento. Ninguém perguntou sobre matrizes cliente / servidor, a questão era sobre matriz de vértices no sentido mais amplo, em comparação com a VBO. Aliás, eu não disse nada sobre o VAO, de onde vem essa idéia?

11

(Estou adicionando isso aqui devido ao fato de que a resposta de ChrisE é altamente ambígua, o que infelizmente é devido à ambiguidade da pergunta original. No entanto, vou assumir que a pergunta do OP deveria ter o título "quando usar VAOs e quando usar VBOs ".)

V ertex B pode ser prejudicado S bjects (que realmente não são muito diferentes de outros tipos de B pode ser prejudicado S bjects, por exemplo L niform B pode ser prejudicado S bjects) proporcionam um meio para envio de dados de vértice para o hardware gráfico.

V ertex Os objetos rray O são usados ​​em adição aos VBOs para melhorar o desempenho do lado do cliente (CPU), reduzindo o número de chamadas necessárias para religar buffers de vértice individuais e redefinir atributos de vértice toda vez que você desejar alterar para renderizar de uma certa maneira. Em vez de fazer tudo o que funciona em todos os quadros, faça-o uma vez (na inicialização) e, em seguida, simplesmente religue o VAO apropriado para cada (conjunto de) chamadas de desenho que usam os atributos de vértice associados.

Apesar disso, usando Vaos não libera você da responsabilidade adicional de ter que fazer glBindBuffer+ glBufferDatapara quaisquer dados que muda cada quadro, por exemplo, posições entidade jogo / rotações / transformam matrizes. É somente quando você tem dados totalmente estáticos que precisa fazer apenas glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)para renderizar.


+1 VAO é um nome terrível e confuso, e sempre me lembra de como o openGL se tornou uma bagunça.
usar o seguinte

1
Também me lembro de ter discutido sobre essa questão (a maior parte foi excluída). Novamente, o problema está na horrível terminologia do OpenGL. Também editei a resposta de Chris para ser mais preciso.
usar o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.