Estoy tratando de aprender sobre matrices de vértices y objetos de búfer de vértices , pero no entiendo las diferencias en términos de:
- caso de uso (geometría estática como terrenos, geometría que cambia cada cuadro como un sistema de partículas, etc.)
- actuación
- portabilidad (tarjeta gráfica antigua, consolas, dispositivos como Android o iPhone, etc.)
algunas aclaraciones?
Respuestas:
Aquí hay una reseña decente sobre los VBO.
Actuación
Aquí hay una buena descripción de la semántica de llamadas.
Aquí hay otra buena descripción de los problemas de rendimiento; en él vemos que los VBO son más efectivos que las matrices.
La razón por la que preferimos los VBO es que los datos se cargan en la tarjeta, por lo que no tiene que transferirlos cada fotograma. Dependiendo del tipo de VBO creado, puede dar al controlador de gráficos pistas sobre el uso (escribir muchos, leer muchos versus escribir muchos, nunca leer, etc.).
Uso
Los VBO son realmente buenos para la geometría estática como el terreno que no espera cambiar, o para la geometría instanciada.
Las matrices de vértices son buenas para los datos que cambian con frecuencia pero que también son leídos por la máquina host, por lo tanto, para representar directamente los datos que se están manipulando (los búferes de datos del telémetro láser, por ejemplo, son donde los he usado) con frecuencia. Si puede salirse con la suya sin leer los datos en el dispositivo host (por lo tanto, simplemente empujándolo hacia la tarjeta), los VBO en modo de solo escritura son una buena opción.
Portabilidad
Matrices de vértices del lado del cliente Están disponibles en OpenGL antes de 3.0, en desuso en 3.0 y desaparecieron en 3.1+. OpenGL ES los admite (OpenGL ES 2 no).
VBO Están disponibles después de OpenGL 1.5. Esta es la única forma de almacenar datos de geometría en OpenGL ES 2 (y, por lo tanto, WebGL).
fuente
(Estoy agregando esto aquí debido al hecho de que la respuesta de ChrisE es altamente ambigua, lo que desafortunadamente se debe a la ambigüedad de la pregunta original. Sin embargo, voy a suponer que la pregunta del OP debería haberse titulado "cuándo usar VAOs" y cuándo usar VBO ".)
Los objetos V ertex B uffer O (que realmente no son diferentes de otros tipos de objetos B uffer O , por ejemplo, los objetos U biforme B uffer O ) proporcionan un medio para cargar datos de vértices al hardware de gráficos.
V ertex A rray O bjects se utilizan además de los VBO para mejorar el rendimiento del lado del cliente (lado de la CPU), al reducir la cantidad de llamadas necesarias para volver a vincular los búferes de vértices individuales y restablecer los atributos de vértices cada vez que desee cambiar para renderizar de cierta manera. En lugar de hacer todo lo que funciona en cada cuadro, lo hace una vez (en la inicialización), y luego simplemente vuelve a vincular el VAO apropiado para cada (conjunto de) llamadas de sorteo que usan los atributos de vértice asociados.
A pesar de esto, el uso de VAO no lo libera de la responsabilidad adicional de tener que hacer
glBindBuffer
+glBufferData
para cualquier dato que cambie cada cuadro, por ejemplo, posiciones de entidades de juego / rotaciones / matrices de transformación. Es solo cuando tiene datos completamente estáticos que solo necesita hacerglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
para renderizar.fuente