現在地: メニュー >> 発展編08
INDEX:発展編07 << 発展編08 >> 発展編09?

VAO(Vertex Array Object)


「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切り替え
}
▲このように、カプセル化する状態の直前に記述する。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます