毎フレーム頂点を更新する方法

vertex-update-per-frame.png

OpenGL2時代

OpenGL2時代は毎フレームに

glBegin(GL_POINTS);
glVertex3f(x,y,z);
glEnd();

などと書いて直感的でラクチンでした。

OpenGL3以降

OpenGL3以降glBegin~glEndは非推奨になってしまいました。
基本的に必要な頂点は初期化の段階で頂点バッファオブジェクトを作ってGPUに転送済みにしてから
毎フレーム描くのが基本です。そのほうがパフォーマンス的にやさしいからです。

なのでOpenGL3以降の書き方で毎フレーム動く頂点を描画すうには?

  1. uniform変数で頂点位置に変化をつける
  2. VBOの中身を更新する
    glUseProgram(mUniColorShaderId);
    glBindVertexArray(mVao); miffy::GetGLError("0");
    glUniformMatrix4fv(mMatrixLocation, 1, GL_FALSE, glm::value_ptr(_matrix));
    glUniform4f(mColorLocation,1.0f,1.0f,1.0f,1.0f); miffy::GetGLError("1");
    float points[] = {
        0.0f,0.0f,
        1.0f,1.0f,
    };
    glBindBuffer(mVbo);
    glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(points),points);
    glDrawArrays(GL_LINES,0,2);
    glUseProgram(0);

glbufferdata glnamedbuffersubdata

サポートサイト Wikidot.com glbufferdataglnamedbuffersubdata