¿Cuándo usar una matriz de vértices y cuándo usar un VBO?

14

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?

nkint
fuente
3
Para cualquier otra persona que llegue aquí, consulte la respuesta más votada aquí ... stackoverflow.com/questions/430555/…
afuzzyllama

Respuestas:

14

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).

ChrisE
fuente
2
En ese PerformanceTuning.pdf, dice que los VBO "pueden dañar el rendimiento en casos no óptimos" ... pero no da más detalles. ¿Alguna idea de cuáles son esos casos? Tengo un caso en el que necesito actualizar la geometría de cada cuadro, por lo que me pregunto si una matriz de vértices sería mejor o peor que un VBO en ese caso. Gracias.
sidewinderguy
1
lea opengl.org/sdk/docs/man/xhtml/glDrawElements.xml y opengl.org/wiki/GlDrawElements - Las matrices de vértices no han sido desaprobadas ni eliminadas, todavía son compatibles con OpenGL 4.x; aclare sus hechos, amigo, porque lo que está difundiendo es solo información errónea
1
@vaxquis Las matrices de vértices del lado del cliente están en desuso. Las matrices de vértices del lado del servidor no lo son. Los VAO son algo diferente y están destinados a salvar el estado. No hubo nada malo en la publicación, aunque podría ser más preciso si se indica el lado del cliente. Pero supongo que eso estaba implícito.
concept3d
1
"Las matrices de vértices del lado del cliente están en desuso. Las matrices de vértices del lado del servidor no". "Matrices de vértices: están disponibles en OpenGL antes de 3.0, en desuso en 3.0 y desaparecieron en 3.1+". "puede especificar previamente matrices separadas de vértices (...) y usarlas para construir una secuencia de primitivas con una sola llamada a glDrawElements. Core en la versión 4.4" - Veo contradicción en estas declaraciones.
2
Además, antes de decir que algo "está en desuso", especifique la fuente de dicha declaración, preferiblemente en un documento oficial. Señalar desde StackExchange a StackOverflow como prueba NO es la forma en que funciona la ciencia, y defender con "Supongo que eso estaba implícito" no es un argumento. Nadie preguntó sobre las matrices de cliente / servidor, la pregunta era sobre la matriz de vértices en el sentido más amplio, en comparación con VBO. Por cierto, no he dicho nada sobre VAO, ¿de dónde viene esa idea?
11

(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+ glBufferDatapara 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 hacer glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)para renderizar.

Ingeniero
fuente
+1 VAO es un nombre terrible y confuso, y siempre me recuerda en qué lío se ha convertido openGL.
concept3d
1
También recuerdo haber tenido una discusión con respecto a esta pregunta (la mayoría fue eliminada). Nuevamente, el problema es con la horrible terminología de OpenGL. También edité la respuesta de Chris para que sea más precisa.
concept3d