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?
Respostas:
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).
fonte
(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
+glBufferData
para 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 apenasglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
para renderizar.fonte