glgenvertexarrays array opengl vertex-buffer vertex-array vertexdata

opengl - glgenvertexarrays - vertex array object



OpenGL vértice confusión confusión (2)

¿Le importaría a alguien explicar la diferencia entre un VertexBuffer , un VertexArray , un VertexBufferObject y un VertexArrayObject ? Ni siquiera estoy seguro de si estos son todos términos para diferentes cosas, pero he visto que todos aparecen en la especificación de OpenGL.

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

Estoy usando lo que creo que es un VertexArray, que almacena el estado de cualquier búfer de vértice que se establece, y también cualquier puntero de vértice. Al enlazar un VertexArray se vincula automáticamente el búfer de vértice y se establecen los punteros de vértice. He utilizado esto (en su mayoría) con éxito también.

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


Una matriz de vértices es simplemente algunos datos en su programa (dentro de su espacio de direcciones) que le dice a OpenGL al proporcionarle un puntero.
Aunque son más eficientes que especificar cada vértice individualmente, todavía tienen problemas de rendimiento. El GL debe hacer una copia en el momento en que llama DrawElements (o una función similar), ya que es la única vez que puede estar seguro de que los datos son válidos (después de todo, nada le impide sobrescribir los datos de inmediato). Esto significa que existe un obstáculo importante para el paralelismo y, por lo tanto, un problema de rendimiento.

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

Los objetos de la matriz de vértices son un poco inapropiados. No hay vértices o matrices en ellos. Son simplemente un tipo de "bloque de descripción de estado" que encapsula los enlaces de uno o varios objetos de búfer de vértice (incluidas las llamadas VertexAttribPointer). Como tales, son una función conveniente y algo más eficiente (menos llamadas de función), pero no son estrictamente necesarias. Usted podría hacer cualquier cosa que un VAO hace a mano, también.


  • BufferObject: un búfer de memoria asignado por la GPU
    • Objeto de búfer de vértice: un objeto de búfer que contiene información de vértices (colores, posición, datos personalizados utilizados por un sombreado, ...)
    • Pixel Buffer Object: un objeto BufferObject que contiene información de píxeles o texel. Se utiliza principalmente para subir texturas.
    • Element Buffer Object: un BufferObject que contiene índices (utilizados por glDrawElements ).
  • Vertex Array: memoria utilizada por gl * Puntero de llamada. Puede ser una memoria de host o un objeto de búfer de vértice si está vinculado mediante el comando GL_ARRAY_BUFFER con GL_ARRAY_BUFFER .
  • Element Array: memoria utilizada por la llamada glDrawElements. Podría ser la memoria del host o un Element Buffer Object si está vinculado mediante el comando GL_ELEMENT_ARRAY_BUFFER con GL_ELEMENT_ARRAY_BUFFER .