Index Buffer使用時には、GL_ELEMENT_ARRAY_BUFFERをBindした後glDrawElementsを使用。
glEnableClientStateで特別な指定をする必要はない。
// バッファ名 GLuint buffer[3]; const int VTX = 0; const int COL = 1; const int IDX = 2;
void init_data() { float v = 0.7; // 頂点データ std::vector< std::array<float,3> > vertex = { { 0.0f, 0.0f ,0.0f}, // 中心 (0) { 1.0f, 0.0f ,0.0f}, // 右中 (1) { 0.5f, 0.87f,0.0f}, // 右上 (2) {-0.5f, 0.87f,0.0f}, // 左上 (3) {-1.0f, 0.0f ,0.0f}, // 左中 (4) {-0.5f, -0.87f,0.0f}, // 左下 (5) { 0.5f, -0.87f,0.0f} // 右下 (6) }; // 色データ std::vector< std::array<float, 3> > color = { {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 1.0f}, {0.0f, 1.0f, 1.0f}, {0.5f, 0.5f, 0.5f} }; // インデックスデータ std::vector< std::array<GLuint, 3> > index = { { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 4 }, { 0, 4, 5 }, { 0, 5, 6 }, { 0, 6, 1 } }; // バッファ作成 glGenBuffers(3, &buffer[0]); /////////////////////////////////////////// // 頂点バッファの作成 glBindBuffer(GL_ARRAY_BUFFER, buffer[VTX]); glBufferData( GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * vertex.size(), vertex[0].data(), GL_STATIC_DRAW); /////////////////////////////////////////// // 色バッファの作成 glBindBuffer(GL_ARRAY_BUFFER, buffer[COL]); glBufferData( GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * color.size(), color[0].data(), GL_STATIC_DRAW); /////////////////////////////////////////// // インデックスバッファの作成 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer[IDX]); glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * 3 * index.size(), index[0].data(), GL_STATIC_DRAW ); }
void render_data() { glEnableClientState(GL_COLOR_ARRAY); // 色配列を有効化 glEnableClientState(GL_VERTEX_ARRAY); // 頂点配列を有効化 // 頂点配列を有効化 glBindBuffer(GL_ARRAY_BUFFER, buffer[VTX]); glVertexPointer(3, GL_FLOAT, 0, 0); // 色配列を有効化 glBindBuffer(GL_ARRAY_BUFFER, buffer[COL]); glColorPointer(4, GL_FLOAT, 0, 0); // インデックス配列を有効化 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer[IDX]); // 描画 glDrawElements(GL_TRIANGLES, 6*3/*6頂点。各頂点3要素*/, GL_UNSIGNED_INT, 0); // 頂点配列を無効化 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }
void finalizer() { glDeleteBuffers(3, buffer); }