甲顶点缓存对象是其中顶点数组的数据可以被存储在缓冲器中。数据一次上传到图形内存(GPU),并且可以重复用于绘制网格。
首先,您必须创建2个缓冲区对象,一个用于顶点,一个用于索引:
int buffers[] = new int[2];GLES20.glGenBuffers(2, buffers, 0);int vbo = buffers[0];int ibo = buffers[1];
然后,您必须绑定缓冲区并传输数据
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);GLES20.glBufferData( GLES20.GL_ARRAY_BUFFER, vertexBuffer.capacity() * 4, // 4 = bytes per float vertexBuffer, GLES20.GL_STATIC_DRAW);GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo);GLES20.glBufferData( GLES20.GL_ELEMENT_ARRAY_BUFFER, drawListBuffer.capacity() * 2, // 2 = bytes per short drawListBuffer, GLES20.GL_STATIC_DRAW);GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
如果要绘制网格,则必须定义通用顶点属性数据的数组,并且必须绑定索引缓冲区,但是不必将任何数据传输到GPU:
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);GLES20.glVertexAttribPointer( mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, 0); // <----- 0, because "vbo" is boundGLES20.glEnableVertexAttribArray(mPositionHandle);GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo);GLES20.glDrawElements( GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, 0); // <----- 0, because "ibo" is boundGLES20.glDisableVertexAttribArray(mPositionHandle);GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
另请参见顶点缓冲区对象(VBO)简介



