Estoy empezando a aprender OpenGL hoy con este tutorial: http://openglbook.com/the-book/
Llegué al capítulo 2, donde dibujo un triángulo, y entiendo todo excepto los VAO (¿está bien este acrónimo?). El tutorial tiene este código:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Si bien entiendo que el código es necesario, no tengo ni idea de lo que hace. Aunque nunca uso VaoId más allá de este punto (excepto para destruirlo), el código no funciona sin él. Supongo que esto se debe a que debe estar vinculado, pero no sé por qué. ¿Este código exacto solo necesita ser parte de todos los programas OpenGL? El tutorial explica los VAO como:
Un Vertex Array Object (o VAO) es un objeto que describe cómo se almacenan los atributos de vértice en un Vertex Buffer Object (o VBO). Esto significa que VAO no es el objeto real que almacena los datos del vértice, sino el descriptor de los datos del vértice. Los atributos de vértice se pueden describir 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 la VAO describe los atributos de vértice. No los he descrito de ninguna manera. ¿Obtiene la información del glVertexAttribPointer? Supongo que debe ser esto. ¿Es la VAO simplemente un destino para la información de glVertexAttribPointer?
En una nota al margen, ¿es aceptable el tutorial que estoy siguiendo? ¿Hay algo que deba tener en cuenta o un tutorial mejor a seguir?
fuente
glVertexAttribPointer
VertexArrayMacro
o algo parecido.Los objetos Vertex Array son como macros en los programas de procesamiento de texto y similares. Aquí se encuentra una buena descripción .
Las macros solo recuerdan las acciones que realizó, como activar este atributo, vincular ese búfer, etc. Cuando llama
glBindVertexArray( yourVAOId )
, simplemente reproduce esos enlaces de puntero de atributo y enlaces de búfer.Entonces, su próxima llamada a dibujar usa lo que esté sujeto a VAO.
Los VAO no almacenan datos de vértices . No. Los datos de vértice se almacenan en un búfer de vértice o en una matriz de memoria del cliente.
fuente
Siempre pienso en VAO como una matriz de búferes de datos utilizados por OpenGL. Usando OpenGL moderno, creará un VAO y Vertex Buffer Objects.
El siguiente paso es vincular datos a un búfer:
En este punto, OpenGL ve:
Ahora podemos usar glVertexAttribPointer para decirle a OpenGL qué representan los datos en el búfer:
OpenGL ahora tiene los datos en el búfer y sabe cómo se organizan los datos en vértices. El mismo proceso se puede aplicar a las coordenadas de textura, etc., pero para las coordenadas de textura habría dos valores.
A continuación, puede unir texturas y dibujar matrices, querrá crear un sombreador Vert y Frag, compilarlo y adjuntarlo a un programa (no incluido aquí).
fuente
VAO es un objeto que representa la etapa de búsqueda de vértices de la canalización de OpenGL y se utiliza para proporcionar entrada al sombreador de vértices.
Puede crear un objeto de matriz de vértices como este
Primero hagamos un ejemplo simple. Considere un parámetro de entrada de este tipo en un código de sombreado
Para completar este atributo podemos usar
Aunque el objeto de matriz de vértices almacena estos valores de atributos estáticos por usted, 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 llene automáticamente usando los datos almacenados en un objeto de búfer que proporcionamos. Cada atributo de vértice obtiene datos de un búfer vinculado a uno de varios enlaces de búfer de vértice. Para este fin utilizamos
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. También usamos laglVertexArrayVertexBuffer()
función para vincular un búfer a uno de los enlaces de búfer de vértice. Usamos laglVertexArrayAttribFormat()
función para describir el diseño y formato de los datos, y finalmente habilitamos el llenado automático del atributo llamandoglEnableVertexAttribArray()
.Cuando se habilita un atributo de vértice, OpenGL enviará datos al sombreador de vértices según el formato y la información de ubicación que haya proporcionado
glVertexArrayVertexBuffer()
yglVertexArrayAttribFormat()
. Cuando el atributo está deshabilitado, el sombreador de vértices recibirá la información estática que proporcione con una llamadaglVertexAttrib*()
.Y codifica en un sombreador
Después de todo, debes llamar a
glDeleteVertexArrays(1, &vao)
.Puede leer OpenGL SuperBible para comprenderlo mejor.
fuente