更新日時:2013-06-15 23:06:01 (Sat)アクセス数: -

glBindVertexArray


目次


概要

void glBindVertexArray(GLuint array);

ハンドル array に関連付けられた頂点配列オブジェクト (VAO: Vertex Array Object) をバインドして利用できる状態にします。
第 1 引数 array には glGenVertexArrays で生成した頂点配列オブジェクトのハンドルを指定します。

ある頂点配列オブジェクトをバインドすると以前にバインドしていた頂点配列オブジェクトのバインドは自動的に解除されます。
ただし、0 を指定した場合には現在バインドされている頂点配列オブジェクトのバインドの解除だけを実行します。


エラー

  • GL_INVALID_OPERATION
    • 第 1 引数 array が glGenBuffers で生成されたハンドルでも 0 でもないときに生成されます。


サンプルコード

以下に、バッファオブジェクトを生成して頂点属性を転送する C++ コードの例を示します。
///**********************************************//**
/// 頂点属性を頂点シェーダに渡します。
/// ここではシェーダのコンパイルとリンクは省略されています。
///**********************************************//**
 
// バッファオブジェクトへのハンドル
GLuint position_buffer;
GLuint color_buffer;
 
// 頂点配列オブジェクトへのハンドル
GLuint vao;
 
// バッファオブジェクトの生成
void CreateBufferObject()
{
    // 三角形ポリゴンの位置と色に対応する頂点属性の定義
    float positions[] = { -0.5f, -0.5f, 0.0f,    0.5f, -0.5f, 0.0f,    0.5f,  0.5f, 0.0f };
    float colors[] =    {  1.0f,  0.0f, 0.0f,    0.0f,  1.0f, 0.0f,    0.0f,  0.0f, 1.0f };
 
    // バッファオブジェクトの生成
    GLuint vbo[2];
    glGenBuffers(2, vbo);
    position_buffer = vbo[0];
    color_buffer = vbo[1];
 
    // 頂点位置をバッファオブジェクトに転送
    glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 9, positions, GL_STATIC_DRAW);
 
    // 頂点色をバッファオブジェクトに転送
    glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 9, colors, GL_STATIC_DRAW);
}
 
// 頂点シェーダの入力属性とバッファオブジェクトを対応付ける
void BindVertexAttribute()
{
    // 頂点シェーダの vertex_position と vertex_color に属性インデックス 0, 1 をマッピング
    glBindAttribLocation(program, 0, "vertex_position");
    glBindAttribLocation(program, 1, "vertex_color");
 
    // フラグメントシェーダの出力変数をマッピング
    glBindFragDataLocation(program, 0, "fragment_color");
 
    // 頂点配列オブジェクトを 1 つ作成してバインド
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
 
    // 頂点位置と頂点色のそれぞれについて頂点属性配列を有効化
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
 
    // バッファオブジェクトに転送した頂点位置をインデックス 0 に関連付ける
    glBindBuffer(GL_ARRAY_BUFFER, position_buffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
 
    // バッファオブジェクトに転送した頂点色をインデックス 1 に関連付ける
    glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
}
 
// レンダリング
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glFlush();
}
 


参考文献

OpenGLに関連するオススメの本や WEB サイトを紹介します.
ページ右の画像をクリックすると Amazon で参考文献を購入できます.

OpenGL策定委員会, 「OpenGLプログラミングガイド 原著第5版」, ピアソンエデュケーション
  • OpenGLの赤本(Red Book)と呼ばれる定番の参考書の日本語版です。
  • 少し値は張りますがOpenGLの基本的な使い方が丁寧にまとめられています。
  • 初心者の方には敷居が高いかもしれませんがOpenGLを極めるつもりなら必須の教本だと思います。

Mark Segal, Kurt Akeley, Jon Leech, 「OpenGL4.0グラフィックスシステム」, カットシステム
  • OpenGLの仕様書の日本語訳です。個人的には翻訳に違和感を覚えることはありませんでした。
  • 英語が苦手な方は本書をAPIリファレンスの代わりに利用できます。
  • チュートリアルのような内容は含まれていませんので他の書籍との併用をオススメします。

床井 浩平, 「GLUTによるOpenGL入門」, 工学社
  • これから OpenGL を初めようとしている方にはこの本がオススメです。
  • おそらく OpenGL に関する文献の中では最も敷居が低く 3DCG に関する知識が全くなくても理解しやすいです。
  • 少し内容は古いかもしれませんが導入という目的では最高の文献で、私もこの本から OpenGL に入門しました。

床井 浩平, 「GLUTによるOpenGL入門2 テクスチャマッピング」, 工学社
  • 上の「GLUT によるOpenGL入門」の続編です。
  • 前作の内容では物足りなかった方は本書を読むことで 3DCG の表現力が大幅に広がります。
  • 引き続き平易な内容となっており、前作を読破した方であれば難なく理解できると思います。

David Wolff , 「OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング-」, ボーンデジタル
  • 最近のゲームに見られるようなリアルな映像をつくりだすにはプログラマブル・シェーダという機能が欠かせません。
  • 床井 浩平さんの「GLUTによるOpenGL入門2 テクスチャマッピング」でもシェーダに関しては少しだけ触れられていますが、書籍の後半で軽く紹介されているだけでいささか物足りない内容ではありますので、本格的に学ぶためにこの本の購入をオススメします。
  • 公式の API リファレンス(英語)です。


質問・コメント欄
名前:
コメント:

すべてのコメントを見る

最終更新:2013年06月15日 23:06