Как создать VAO в openGL ES 3 android - PullRequest
1 голос
/ 12 марта 2020

Таким образом, в обычном openGL вы можете создать VAO, подобный этому

glGenVetrexArray();

, и ожидать, что эта функция создаст для вас VAO и даст вам int, который является идентификатором VAO.

Проблема

В android функция выглядит следующим образом:

glGenVetrexArray(int n , int[] array, int offset);

Я не знаю, каковы эти параметры, и я не знаю, как создать VAO и получить идентификатор, используя этот метод выше?

1 Ответ

0 голосов
/ 13 марта 2020

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

...