スポンサーリンク

OpenGL 1.5 相当の機能でVBOありシェーダ指定なしで描画する(2) Index Bufferを使用

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);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: