n - количество (количество) возвращаемых VAO;
array - массив n-элементов с идентификаторами созданных объектов;
offset - установить смещение для VAO (обычно = 0).
При создании VAO он актуализируется с помощью функции: GLES30.glBindVertexArray (VAO [0]). После привязки VAO все вызовы, такие как: glBindBuffer, glEnableVertexAttribArray, glVertexAttribPointer, будут влиять на текущий VAO.
public class Renderer implements GLSurfaceView.Renderer {
private int[] VBOIds = new int[2]; // VertexBufferObject Ids
private int[] VAOId = new int[1]; // VertexArrayObject Id
public Renderer(...) {
// create vertex buffer objects
VBOIds[0] = 0;
VBOIds[1] = 0;
GLES30.glGenBuffers(2, VBO, 0);
...
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, VBO[0]);
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, verticesData.length * 4,
vertices, GLES30.GL_STATIC_DRAW);
...
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, VBO[1]);
GLES30.glBufferData(GLES30.GL_ELEMENT_ARRAY_BUFFER, indicesData.length * 2, indices, GLES30.GL_STATIC_DRAW);
...
}
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
GLES30.glGenVertexArrays(1, VAOId, 0); // Generate VAO Id
GLES30.glBindVertexArray(VAOId[0]); // Bind the VAO
// invokes commands glBindBuffer, glEnableVertexAttribArray,
// glVertexAttribPointer for VBOs
...
// Reset to the default VAO (default VAO always is 0)
GLES30.glBindVertexArray(0);
}
public void onDrawFrame() {
...
GLES30.glBindVertexArray(VAOId[0]); // active VAO
// Draw on base the VAO settings
GLES30.glDrawElements(GLES30.GL_TRIANGLES, indicesData.length,
GLES30.GL_UNSIGNED_SHORT, 0);
// Return to the default VAO
GLES30.glBindVertexArray(0);
}
}
Хороший пример использования VAO * можно увидеть здесь
Проект VertexArrayObjects для Android