开发者社区> 问答> 正文

如何在openGL ES 3 android中创建VAO

因此,在普通的openGL中,您可以像这样创建一个VAO

glGenVetrexArray();

并期望此函数为您创建一个VAO,并为您提供一个VAO ID的整数。

问题

在android中,功能如下:

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

我不知道这些参数是什么,也不知道如何使用上述方法创建VAO并获取ID?

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 22:35:47 567 0
1 条回答
写回答
取消 提交回答
  • n-要返回的VAO数量(数量);

    数组-具有已创建对象标识符的n个元素的数组;

    偏移量= 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);
        }
    }```
    您可以在[此处](https://github.com/danginsburg/opengles3-book/blob/master/Android_Java/Chapter_6/VertexArrayObjects/src/com/openglesbook/VertexArrayObjects/VAORenderer.java)看到使用VAO的一个很好的例子
    
    [适用于Android的Project VertexArrayObjects](https://github.com/danginsburg/opengles3-book/tree/master/Android_Java/Chapter_6/VertexArrayObjects)
    
    回答来源:Stack Overflow
    2020-03-27 22:36:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载