2011-04-08 13 views
17

qué alguien cuidado de explicar la diferencia entre un ser VertexBuffer, un VertexArray, un VertexBufferObject, y una VertexArrayObject? Ni siquiera estoy seguro de si estos son términos para cosas diferentes, pero los he visto aparecer en las especificaciones de OpenGL.OpenGL confusión búfer de vértices

Sé que un VertexBuffer simplemente contiene vértices y nada más, una vez encuadernado, y una vez que haya establecido los punteros de los vértices, puedo usar DrawArrays para dibujarlo. Lo he hecho de esta manera muchas veces.

Estoy usando lo que creo que es un VertexArray, que almacena el estado de cualquier búfer de vértice que se establezca, y también cualquier puntero de vértice. La vinculación de un VertexArray vincula automáticamente el búfer de vértices y establece los punteros de vértice. Lo he usado (la mayoría) con éxito también.

Pero lo que es un VertexBufferObject, y una VertexArrayObject? ¿Están mejor? ¿VertexArray no me da todo lo que necesito?

Respuesta

15

Una matriz de vértices es simplemente algunos datos en su programa (dentro de su espacio de direcciones) que le indica a OpenGL proporcionando un puntero a ella.
Aunque es más eficiente que especificar cada vértice individualmente, todavía tienen problemas de rendimiento. El GL debe hacer una copia al momento de llamar a DrawElements (o una función similar), porque es la única vez que puede asegurarse de que los datos sean válidos (después de todo, nada le impide sobrescribir los datos de inmediato). Esto significa que hay un obstáculo significativo para el paralelismo, y por lo tanto un problema de rendimiento.

Los objetos de búfer vértice ("búferes de vértices") son bloques de datos sin procesar que no son suyos, es decir, no están en su espacio de direcciones. Puede copiar datos en el objeto del búfer con Copiar (Sub) Datos o mapearlo temporalmente en su espacio de direcciones. Una vez que desasignas el buffer, ya no te pertenece. La gran ventaja es que ahora el GL puede decidir qué hacer con él y cuándo subirlo. Sabe que los datos serán válidos, porque no puede acceder a ellos. Esto hace que el paralelismo CPU/GPU sea mucho más fácil.

Vertex array abjects son un nombre poco apropiado. No hay vértices o matrices en ellos. Son simplemente un tipo de "bloque de descripción de estado" que encapsula las vinculaciones de uno o varios objetos de búfer de vértice (incluidas las llamadas de VertexAttribPointer). Como tales, son una función de conveniencia y algo más eficiente (menos llamadas a funciones), pero no estrictamente necesarias. También podría hacer cualquier cosa que un VAO haga a mano.

+0

Entonces lo que mencioné en mi tercer párrafo era muy probablemente un objeto de matriz de vértices, que es el mejor para las aplicaciones normales. Gracias por aclarar esto para mí. – Hannesh

+0

En relación con _VAO son una conveniencia y no estrictamente necesarios_: si lo entiendo correctamente, esto es incorrecto al usar un perfil de núcleo OpenGL 3.1+. Trabajar con un VBO ahora requiere tener un VAO. Por ejemplo, 'glEnableVertexAttribArray' [falla] (http://www.opengl.org/wiki/GLAPI/glEnableVertexAttribArray#Errors) si no hay un límite VAO. Sin embargo, es posible introducir un VAO "global", [como se sugiere en esta respuesta] (http://stackoverflow.com/a/13405205/1804173). – bluenote10

+1

@ bluenote10: Sí, para la versión 3.1 y contextos de perfil de núcleo más altos, debe obligar al menos un VAO (no es necesario que utilice varios para cambiar, sin embargo). Pero eso no es lo que quise decir. VAO es _ "algo conveniente que no es estrictamente necesario" _ en la medida en que no hace nada "especial" que de otro modo no podría hacer. Solo hace que cambiar el estado combinado sea más rápido y más fácil. No podría hacer lo que hace una textura o lo que hace un búfer de vértices sin una textura o sin un búfer de vértices. Pero podría hacer lo que hace con un VAO sin un VAO (solo más llamadas de función). – Damon

7
  • BufferObject: un búfer de memoria de la GPU asignado
    • Vertex Buffer Referencia: a BufferObject contiene información vértices (colores, posición, datos personalizados utilizados por un shader, ...)
    • Pixel memoria intermedia de objetos: un BufferObject que contiene información de pixel o texel. Principalmente utilizado para cargar texturas.
    • Element Buffer Object: un BufferObject que contiene índices (utilizado por glDrawElements).
  • Vertex Array: memoria utilizada por gl * Llamada de puntero. Puede ser la memoria de host o un Objeto de búfer de vértice si está enlazado usando el comando glBindBuffer con GL_ARRAY_BUFFER.
  • Arreglo de elementos: memoria utilizada por la llamada glDrawElements. Puede ser una memoria de host o un Objeto de búfer de elemento si está enlazado usando el comando glBindBuffer con GL_ELEMENT_ARRAY_BUFFER.
+0

Gracias. Esta es la respuesta más concisa que he leído para este tema. –

Cuestiones relacionadas