SAMPLE
VBO
■ BufferObjectに頂点配列(VertexArray)を配置する
DESC
頂点データをビデオメモリに配置することで描画を高速化する機能のこと。
アプリケーション側のメモリを解放もでき、
また CPU < -> GPU 間での頻繁なデータの転送も不要になる。
DEP
VERSION::1.5
App::onInit() {
glGenBuffers =
(PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
glBindBuffer =
(PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
glBufferData =
(PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
// BufferObject ID を確保
glGenBuffers( n, bufs );
// buffer をバインドして頂点データ, インデックスデータのどちらかを指定する。
// Buffer Object を選択して初期化
glBindBuffer( GL_ARRAY_BUFFER, id );
// 頂点属性
struct Vertex {
float vtx[3];
float col[3]
};
// OpenGL側に記憶領域を確保してもらいアプリケーション側のデータをコピーする
Vertex vtx[] = {
0, 0, 0, 1, 1, 1,
1, 0, 0, 1, 1, 1,
1, 1, 0, 1, 1, 1,
0, 1, 0, 1, 1, 1,
};
glBufferData( GL_ARRAY_BUFFER, sizeof(vtx), vtx, GL_STATIC_DRAW );
// 頂点と同じようにインデックス用のVBOを作成する。
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );
// インデックスデータをコピーする。
unsigned short idx[] = { 0, 1, 2, 3 };
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(idx), idx, GL_STATIC_DRAW );
}
App::onDraw() {
// 描画に利用する VBO を指定する。
glBindBuffer( GL_ARRAY_BUFFER, id );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );
// VBO を利用するときは, 頂点データのポインタではなく VBO 内のオフセットを指定する。
// インターリーブ型の配列のため stride は頂点ごとのバイト数を指定する。
// pointer 引数には各頂点属性のオフセットを指定する。
glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), 0 )
glColorPointer ( 3, GL_FLOAT, sizeof(Vertex), sizeof( float )*3; )
// 頂点配列を使うときは OpenGL にどこから Data をとるか指定する
// Data を直接送るときも, BufferObject を利用するときも同じ
// 頂点データは既に転送済のため, 要素数、要素型 オフセットのみを指定する。
// VBO の先頭から指定するため offset = 0
//
glVertexPointer( 3, GL_FLOAT, 0, (GLvoid *)( (char*)0 ) );
glVertexPointer( 3, GL_FLOAT, 0, (void *)0 );
// 描画する。
// VBO を利用しているので pointer はメインメモリのアドレスではなく
// インデックス用のVBO内のオフセットを指定する。
glDrawElements( GL_QUADS, 1, GL_UNSIGNED_SHORT, 0 );
}
終了時はバッファオブジェクトを解放する。
App::onQuit() {
glDeleteBuffers( n, bufs );
}
TIP
id = 0; GL は VBO を使用しなくなる
glBindBuffer() ではじめて Bind すると作成
-> 2度目からは, Bind ( glBindTexture とおなじ )
BufferObject , ClientMemory 共に指定する Interface は同一
■ glGenBuffers
SYNTAX
glGenBuffers(
GLsizei n, // 取得する BufferObject の個数
GLuint *buf
)
DESC
n 個の BufferObject の ID を取得する
// Buffer Object の生成
glGenBuffers( 1, (GLuint *)&id_src );
■ glBindBuffer
SYNTAX
glBindBuffer(
GLenum tgt, // BufferObject のタイプ
GLuint id // glGenBuffers で作成した ID
)
DESC
カレントの BufferObject を選択する
新規の Buffer ならば初期化される( 空Data の Object が作成される )
// 選択をはずすには 0 を指定する
glBindBuffer( GL_ARRAY_BUFFER, 0 );
// 頂点配列を格納するためのバッファを作成するには GL_ARRAY_BUFFER
glBindBuffer( GL_ARRAY_BUFFER, id );
// Index を格納するには GL_ELEMENT_ARRAY_BUFFER を指定する
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );
■ glBufferData
SYNTAX
glBufferData(
GLenum tgt,
GLsizeiptr size, // バッファオブジェクト全体のサイズ
const GLvoid *data, // コピー元のデータ
GLenum usage
)
DESC
Client Memory から BufferObject へデータをコピーする。
転送先は glBindBuffer() で指定しておく
データは glBufferData() をコールした時点で転送される。
Specifies the expected usage pattern of the data store.
The symbolic constant must be
GL_STREAM_DRAW,
GL_STREAM_READ,
GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, or GL_DYNAMIC_COPY.
usage is a hint to the GL implementation as to how a buffer object's data store will be accessed.
This enables the GL implementation to make more intelligent decisions that may significantly impact buffer object performance.
It does not, however, constrain the actual usage of the data store.
usage can be broken down into two parts:
first, the frequency of access (modification and usage),
and second, the nature of that access.
The frequency of access may be one of these:
STREAM
The data store contents will be modified once and used at most a few times.
STATIC
The data store contents will be modified once and used many times.
DYNAMIC
The data store contents will be modified repeatedly and used many times.
DRAW
The data store contents are modified by the application, and used as the source for GL drawing and image specification commands.
READ
The data store contents are modified by reading data from the GL, and used to return that data when queried by the application.
COPY
The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.
// buffer object 用の領域を確保と転送
glBufferData( GL_ARRAY_BUFFER, 3*sizeof(float)*cnt, vtx, GL_STATIC_DRAW );
■ glDeleteBuffers
SYNTAX
glDeleteBuffers(
GLsizei n,
GLuint *bufs
)
DESC
指定 ID の BufferObject を解放する
不要になったら ServerMemory を解放すること