VAO(Vertex ArrayObject)

vao.png

vertex-array-object

VAO は頂点 Attribute の情報を保存し、描画時に利用することができます。
つまり、今まで描画する度にglVertexAttribPointerを呼んでいたのが、しなくてよくなるわけです。

頂点情報とインデックス情報は1つのVAOにまとめることが出来ます。
new type of GL object, the "vertex array object", which stores a set of bindings to vertex arrays; this allows such arrays to be rebound with one function call rather than several calls to EnableVertexAttribArray, VertexAttribPointer, etc.

GLuint vbo = 0;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), points, GL_STATIC_COPY);
GLuint vao = 0;
        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

OpenGL 3.x (core profile) 以降は VAO が必須で、glBindVertexArray() が無いと
glVertexAttribPointer() がエラーになります。

描画する時

glBindVertexArray(mVaoID);//vaoをバインドするだけ!
glDrawelEments(GL_TRIANGLES,...);

vaoとvboを関連付けるには?

glBindVertexArray(mVao)

してから[[vbo]]作りをしましょう
    void InitGeometry() {
        glGenVertexArrays(1, &mVao);//新しいvaoが作られ、名前が割り振られる。
        glBindVertexArray(mVao);//vaoがアクティブになる
 
        //triangle
        float points[] = {
            0.0f,  0.5f,  0.0f,
            0.5f, -0.5f,  0.0f,
            -0.5f, -0.5f,  0.0f
        };
        GLuint vbo = 0;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
 
        glUseProgram(mUniColorShaderId);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    }

glBindVertexArray

vaoをアクティブにします。
もし

glBindVertexArray(0);

としたらOpenGLはvaoの使用を停止します。

サポートサイト Wikidot.com