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?
O VAO armazena o estado glVertexAttribPointer. A alteração do VAO não afeta o glBindBuffer atual, nem a alteração do glBindBuffer afeta o VAO. Somente a chamada glVertexAttribPointer afeta o VAO, gravando o buffer em uso na chamada.
Portanto, a resposta para sua pergunta é não.
Uma opção se você deseja reduzir o número de objetos é colocar todos os seus dados de malha em um VBO grande e especificar onde os dados da malha residem no VBO na chamada glDrawArrays usando os argumentos 'first' e 'count'.
fonte
glBindBuffer
estado, exceto,GL_ELEMENT_ARRAY_BUFFER
é alterado pela ligação de um VAO.