En todos los tutoriales que puedo encontrar sobre VAO (Vertex Array Objects), muestran cómo usarlos configurando atributos de vértice y vinculando un VBO (Vertex Buffer Object). Pero quiero crear un VAO que se configure para un conjunto de VBO en combinación con un sombreador fijo, donde cada búfer use el mismo patrón de datos (vértice, uv, color, etc.). Por lo tanto, quiero crear un VAO para varios VBO que se dibujarán con un sombreador.
No pude encontrar ninguna demostración de esto, así que decidí probarlo. Pero no funciona y se bloquea en la glDrawArray
llamada. Parece que el VBO no está vinculado. Aquí está el código que estoy usando:
Representación:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
Creación de VAO:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Donde ls
es un simple struct
que contiene las ubicaciones de los atributos.
En la parte de Renderizado, intercambiar el glBindBuffer
y el glBindVertexArrayOES
entorno tampoco funcionó.
Entonces, la pregunta es: ¿es posible hacerlo, o tendré que crear un VAO para cada búfer? Y si tengo que crear un VAO para cada VBO, ¿es posible actualizar los datos del VBO glBufferSubData
en combinación con un VAO?
El VAO almacena el estado glVertexAttribPointer. Cambiar el VAO no afecta el glBindBuffer actual, ni cambiar el glBindBuffer afecta el VAO. Solo la llamada glVertexAttribPointer afecta al VAO, al registrar el búfer en uso en la llamada.
Entonces la respuesta a tu pregunta es no.
Una opción si desea reducir la cantidad de objetos es colocar todos sus datos de malla en un VBO grande y especificar dónde viven los datos de malla en el VBO en la llamada glDrawArrays utilizando los argumentos 'primero' y 'contar'.
fuente
glBindBuffer
estado exceptoGL_ELEMENT_ARRAY_BUFFER
se cambia al vincular un VAO.