Cómo crear y usar VBO en OpenGL ES 2

Estoy buscando ayuda para comprender los VBO. He investigado mucho y he encontrado tutoriales sobre el tema, pero todavía son vagos para mí. Tengo algunas preguntas:

¿Dónde se debe crear un VBO y cómo debo crear uno?

Actualmente estoy usando el código justo debajo para inicializar mis búferes de vértices e índices:

    vertices = new float[]
            {
                    p[0].x, p[0].y, 0.0f,
                    p[1].x, p[1].y, 0.0f,
                    p[2].x, p[2].y, 0.0f,
                    p[3].x, p[3].y, 0.0f,
            };

    // The order of vertex rendering for a quad
    indices = new short[] {0, 1, 2, 0, 2, 3};

    ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4);
    bb.order(ByteOrder.nativeOrder());
    vertexBuffer = bb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    ByteBuffer dlb = ByteBuffer.allocateDirect(indices.length * 2);
    dlb.order(ByteOrder.nativeOrder());
    drawListBuffer = dlb.asShortBuffer();
    drawListBuffer.put(indices);
    drawListBuffer.position(0);

Si estoy en lo correcto, esto no está creando un VBO. Entonces, si quisiera hacer un VBO, ¿el código para crear un VBO iría justo después del código mencionado anteriormente? Si es así, ¿cómo se crearía?

Además, ¿cómo se representa y dibuja un VBO en la pantalla?

¿Se procesa y dibuja de la misma manera que solo usando matrices de vértices e índices? Si no, ¿cuál es el proceso? Actualmente, renderizo y dibujo mis objetos como se muestra en el siguiente código:

    GLES20.glUseProgram(GraphicTools.sp_SolidColor);

    mPositionHandle =
            GLES20.glGetAttribLocation(GraphicTools.sp_SolidColor, "vPosition");

    GLES20.glEnableVertexAttribArray(mPositionHandle);

    GLES20.glVertexAttribPointer(mPositionHandle, 3,
            GLES20.GL_FLOAT, false,
            0, vertexBuffer);

    mtrxHandle = GLES20.glGetUniformLocation(GraphicTools.sp_SolidColor,
            "uMVPMatrix");

    GLES20.glUniformMatrix4fv(mtrxHandle, 1, false, m, 0);

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length,
            GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

    GLES20.glDisableVertexAttribArray(mPositionHandle);

Si usted tiene alguna pregunta, hágamelo saber. Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta