transformacion sombras primitivas matriz matrices letras geometricas figuras esfera animacion opengl vbo vertex-array vao

sombras - primitivas 3d opengl



¿Qué son los Objetos de matriz vértice? (3)

"Objeto Vertex Array" es traído a usted por el Subcomité OpenGL ARB para nombres tontos.

Piense en ello como un objeto de geometría. (Como antiguo programador de SGI Performer, los llamo geosets.) Las variables de instancia / miembros del objeto son su puntero de vértice, puntero normal, puntero de color, puntero N de attrib, ...

Cuando se vincula por primera vez un VAO, se asignan estos miembros llamando

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...; glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...;

y así. Qué atributos están habilitados y los punteros que suministra están almacenados en el VAO.

Después de eso, cuando vincula el VAO de nuevo, todos los atributos y punteros también se actualizan. Entonces, una llamada glBindVertexArray es equivalente a todo el código previamente necesario para configurar todos los atributos. Es útil para pasar geometría entre funciones o métodos sin tener que crear sus propias estructuras u objetos.

(La configuración única, el uso múltiple es la forma más fácil de usar VAO, pero también puede cambiar los atributos simplemente vinculándolos y haciendo más llamadas de habilitación / puntero. Los VAO no son constantes).

Más información en respuesta a las preguntas de Patrick:

El valor predeterminado para un VAO recién creado es que está vacío (AFAIK). No hay geometría en absoluto, ni siquiera vértices, por lo que si intentas dibujarlo, obtendrás un error de OpenGL. Esto es razonablemente sensato, como en "inicializar todo a False / NULL / zero".

Solo necesita glEnableClientState cuando configure las cosas. El VAO recuerda el estado habilitar / deshabilitar para cada puntero.

Sí, el VAO almacenará glEnableVertexAttribArray y glVertexAttrib . Las matrices de vértice antiguo, normal, color ... son las mismas que las matrices de atributos, vértice == # 0 y así sucesivamente.

Estoy empezando a aprender OpenGL hoy de este tutorial: http://openglbook.com/the-book/
Llegué al capítulo 2, donde dibujo un triángulo, y entiendo todo excepto VAO (¿este acrónimo es correcto?). El tutorial tiene este código:

glGenVertexArrays(1, &VaoId); glBindVertexArray(VaoId);

Si bien entiendo que el código es necesario, no tengo idea de lo que hace. Aunque nunca uso VaoId después de este punto (excepto para destruirlo), el código no funciona sin él. Estoy asumiendo que esto se debe a que es obligatorio estar obligado, pero no sé por qué. ¿Este código exacto solo necesita ser parte de cada programa OpenGL? El tutorial explica los VAO como:

Un Objeto de matriz de vértices (o VAO) es un objeto que describe cómo se almacenan los atributos de vértice en un Objeto de búfer de vértice (o VBO). Esto significa que el VAO no es el objeto real que almacena los datos de vértice, sino el descriptor de los datos de vértice. Los atributos de vértice pueden describirse mediante la función glVertexAttribPointer y sus dos funciones hermanas glVertexAttribIPointer y glVertexAttribLPointer, la primera de las cuales exploraremos a continuación.

No entiendo cómo el VAO describe los atributos de los vértices. No los he descrito de ninguna manera. ¿Obtiene la información del glVertexAttribPointer? Creo que esto debe ser. ¿El VAO es simplemente un destino para la información de glVertexAttribPointer?

En una nota lateral, ¿es aceptable el tutorial que estoy siguiendo? ¿Hay algo de lo que debería tener cuidado o un mejor tutorial para seguir?


Vertex Array Objects son como macros en programas de procesamiento de textos y similares. Una buena descripción se encuentra here .

Las macros solo recuerdan las acciones que hizo, como activar este atributo, enlazar ese buffer, etc. Cuando llama a glBindVertexArray( yourVAOId ) , simplemente reproduce los enlaces de puntero de atributo y enlaces de buffer.

Entonces, su próxima llamada a dibujar usa lo que estaba vinculado por VAO.

VAO no almacena datos de vértice . No. Los datos de vértice se almacenan en un búfer de vértices o en una matriz de memoria de cliente.


VAO es un objeto que representa la etapa de captación de vértices de la tubería de OpenGL y se utiliza para suministrar entrada al sombreador de vértices.

Puede crear un objeto de matriz de vértices como este

GLuint vao; glCreateVertexArrays(1, &vao); glBindVertexArray(vao);

Primero, hagamos un simple ejemplo. Considere un parámetro de entrada de este tipo en un código de sombreado

layout (location = 0) in vec4 offset; // input vertex attribute

Para completar este atributo, podemos usar

glVertexAttrib4fv(0, attrib); // updates the value of input attribute 0

Aunque el objeto de matriz de vértices almacena estos valores de atributos estáticos, puede hacer mucho más.

Después de crear el objeto de matriz de vértices, podemos comenzar a completar su estado. Le pediremos a OpenGL que lo complete automáticamente utilizando los datos almacenados en un objeto de memoria intermedia que suministramos. Cada atributo de vértice obtiene datos de un búfer vinculado a uno de varios enlaces de búfer de vértices. Para este fin, usamos glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex) . También utilizamos la función glVertexArrayVertexBuffer() para vincular un búfer a uno de los enlaces de búfer de vértices. Utilizamos la función glVertexArrayAttribFormat() para describir el diseño y el formato de los datos, y finalmente habilitamos el llenado automático del atributo llamando a glEnableVertexAttribArray() .

Cuando se habilita un atributo de vértice, OpenGL alimentará los datos al sombreador de vértices según el formato y la información de ubicación que haya proporcionado con glVertexArrayVertexBuffer() y glVertexArrayAttribFormat() . Cuando el atributo está desactivado, el sombreador de vértices recibirá la información estática que usted proporciona con una llamada a glVertexAttrib*() .

// First, bind a vertex buffer to the VAO glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4)); // Now, describe the data to OpenGL, tell it where it is, and turn on automatic // vertex fetching for the specified attribute glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0); glEnableVertexArrayAttrib(vao, 0);

Y codifica en un sombreador

layout (location = 0) in vec4 position;

Después de todo, debe llamar a glDeleteVertexArrays(1, &vao) .

Puedes leer OpenGL SuperBible para entenderlo mejor.