Em todos os tutoriais que posso encontrar sobre os VAO (Vertex Array Objects), eles mostram como usá-los, configurando atributos de vértice e vinculando um VBO (Vertex Buffer Object). Mas eu quero criar um VAO que será configurado para um conjunto de VBOs em combinação com um sombreador fixo, em que cada buffer usa o mesmo padrão de dados (vértice, UV, cor, etc.). Então, eu quero criar um VAO para vários VBOs que serão desenhados usando um shader.
Não consegui encontrar nenhuma demonstração sobre isso, então decidi tentar. Mas não funciona e trava na glDrawArray
chamada. Parece que o VBO não está vinculado. Aqui está o código que estou usando:
Renderização:
/* 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);
Criação 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);
Onde ls
é um simples struct
que contém os locais dos atributos.
Na parte Rendering, trocando o glBindBuffer
e oglBindVertexArrayOES
redor também não funcionou.
Então, a pergunta é: é possível, ou terei que criar para cada buffer um VAO? E se eu tiver que criar um VAO para cada VBO, é possível atualizar os dados do VBO usando glBufferSubData
em combinação com um VAO?