最終更新: mikk_ni3_92 2010年03月01日(月) 18:29:45履歴
現在地: メニュー >> 発展編08
INDEX:発展編07 << 発展編08 >> 発展編09?
「Vertex Array Object」は頂点配列の使用時に必要な状態の制御をカプセル化するものである。
簡単にいうと、VBOなどの描画時に行っている
「glEnableClientState関数」で有効化して、「glVertexPointer関数」等でデータの格納場所を指定して…
という処理がもっと簡単にできるようになるということ。
【例】:VAOを使ったプログラムのイメージ
VBOをバインドして格納場所を指定して、またVBOをバインドして格納場所を指定して…
となる。
VAOでは、あらかじめその切り替える内容をどこかに配置しておいて、
切り替えるようなイメージ。
基本的に使用する関数は次の3つ
※いくつ作るかを指定し、バインドする
【例】
INDEX:発展編07 << 発展編08 >> 発展編09?
「Vertex Array Object」は頂点配列の使用時に必要な状態の制御をカプセル化するものである。
簡単にいうと、VBOなどの描画時に行っている
「glEnableClientState関数」で有効化して、「glVertexPointer関数」等でデータの格納場所を指定して…
という処理がもっと簡単にできるようになるということ。
【例】:VAOを使ったプログラムのイメージ
void DRAW() { glBindVertexArray(VaoId[0]);//vao切り替え glDrawArrays(GL_QUADS,0,4*6); glBindVertexArray(VaoId[1]);//vao切り替え glDrawArrays(GL_TRIANGLES,0,3*4); glBindVertexArray(0);//vao切り替え }▲例えば普通にVBOなどを使った場合は、
VBOをバインドして格納場所を指定して、またVBOをバインドして格納場所を指定して…
となる。
VAOでは、あらかじめその切り替える内容をどこかに配置しておいて、
切り替えるようなイメージ。
基本的に使用する関数は次の3つ
- glGenVertexArrays
- glBindVertexArray
- glDeleteVertexArrays
※いくつ作るかを指定し、バインドする
【例】
//VAO用ID GLuint VaoId[2]; … … //vboを作成+VAOでカプセル化する void BuildVBO() { //Vao2つ作成 glGenVertexArrays(2,&VaoId[0]); glBindVertexArray(VaoId[0]);//vao切り替え glGenBuffers(2, &VboId[0]);//VBO2つ作成 //-------------- VBO1つ目 ----------------------// glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド //--- データをVBOにコピーする …等 ---// glEnableClientState(GL_VERTEX_ARRAY); … … glVertexPointer(3, GL_FLOAT, 0, 0); //VAO切り替え glBindVertexArray(VaoId[1]); //---------------- VBO 2つ目 ----------------------// glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド //-- データをVBOにコピーする …等 --// glEnableClientState(GL_VERTEX_ARRAY); … … glVertexPointer(3, GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); //アンバインド glBindVertexArray(0); } void DRAW() { glBindVertexArray(VaoId[0]);//vao切り替え glDrawArrays(GL_QUADS,0,4*6); glBindVertexArray(VaoId[1]);//vao切り替え glDrawArrays(GL_TRIANGLES,0,3*4); glBindVertexArray(0);//vao切り替え }▲このように、カプセル化する状態の直前に記述する。