VBO(頂点バッファオブジェクト)

vbo.png

ビデオカードのRAMに予めデータを置いておき
PC本体から毎回データを転送しなくても良いようにするのがVBOです。

全体の手順

頂点、法線、テクスチャ座標の場合

  1. glGenBuffers(何個作るか,頂点バッファID配列)
  2. glBindBuffer(GL_ARRAY_BUFFER, 頂点バッファのID)
  3. glBufferData(GL_ARRAY_BUFFER,バッファに入れる合計データサイズ,データポインタ, GL_STATIC_DRAW )
  4. glVertexPointer(3,GL_FLOAT,sizeof(float)*3,0);…..その他、法線、テクスチャ座標、interleavedなんでのがある
  5. glEnableClientState(GL_VERTEX_ARRAY);
  6. glDrawElements(GL_LINE_LOOP,18,GL_UNSIGNED_SHORT,0);
  7. glDisableClientState(GL_VERTEX_ARRAY);
  8. glBindBuffer(GL_ARRAY_BUFFER, 0);
  9. glDeleteBuffers()

頂点インデックスデータの場合

  1. GLES20.glGenBuffers(何個作るか,頂点バッファID配列)
  2. GLES20.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 頂点バッファのID)
  3. GLES20.glBufferData(GL_ELEMENT_ARRAY_BUFFER,バッファに入れる合計データサイズ,データポインタ, GL_STATIC_DRAW )
  4. GLES20.glDrawElements(GL_LINE_LOOP,18,GL_UNSIGNED_SHORT,0);
  5. GLES20.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
/* バッファオブジェクトの名前を2つ作る */
  glGenBuffers(2, buffers);
 
  /* 1つ目のバッファオブジェクトに頂点,法線,テクスチャ座標を合わせた領域を確保する */
  glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
  glBufferData(GL_ARRAY_BUFFER,バッファに入れる合計データサイズ,データポインタ, GL_STATIC_DRAW);

描くとき

頂点配列を参考に

 glBindBuffer(GL_ARRAY_BUFFER, m_BufferId);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IdBuffer);
        glVertexPointer(3,GL_FLOAT,sizeof(float)*3,0);
        glEnableClientState(GL_VERTEX_ARRAY);
        glDrawElements(GL_LINE_LOOP,18,GL_UNSIGNED_SHORT,0);
        glDisableClientState(GL_VERTEX_ARRAY); 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

参考したページ

InterLeavedArrayとインデックスを使ったVBO

頂点の数より色の数のほうが断然少ない場合のVBOはどうしたらいいのか、

同じ悩みを持つ人これによると、glColorを使えとの声が多し。

glBufferSubData

確保したデータバッファの一部を書き換える

glBufferSubData(GL_ARRAY_BUFFER, オフセットバイト数, データポインタ);

後片付け

if(mVertexBufferID != -1) {
        glDeleteBuffers(1, &mVertexBufferID);
    }

サポートサイト Wikidot.com