OpenGLレッドブックの103ページに、buffer_objectを使用して何かを描画する方法の例(例2-17)を示します。OpenGL:描画にbuffer_objectsを使用する方法
#define BUFFER_OFFSET(bytes) ((GLubyte*) NULL + (bytes))
GLuint buffers[NUM_BUFFERS];
GLfloat vertices[][3] = {
{ -1.0, -1.0, -1.0 },
{ 1.0, -1.0, -1.0 },
{ 1.0, 1.0, -1.0 },
{ -1.0, 1.0, -1.0 },
{ -1.0, -1.0, 1.0 },
{ 1.0, -1.0, 1.0 },
{ 1.0, 1.0, 1.0 },
{ -1.0, 1.0, 1.0 }
};
GLubyte indices[][4] = {
{ 0, 1, 2, 3 },
{ 4, 7, 6, 5 },
{ 0, 4, 5, 1 },
{ 3, 2, 6, 7 },
{ 0, 3, 7, 4 },
{ 1, 5, 6, 2 }
};
glGenBuffers(NUM_BUFFERS, buffers);
//Generate NUM_BUFFERS of buffers and put them in buffers array.
glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
//bind buffers
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//allocate space for buffers
glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
ここでは、どのアレイでデータを見つけるかを指定する配列を指すと仮定します。それはサーバーのいくつかのメモリアドレスへのポインタにする必要がありますか?
私はちょうどそのBUFFER_OFFSET(0)を理解していません。
これは、サーバーに常に1つのVertex_Arrayがあり、プログラムがそのアドレスを自動的に選択することを意味しますか? BUFFER_OFFSET(0)は、この配列でどこから開始するかを教えてくれるでしょう。?????????
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
ここでも同じです。最後のパラメータでアドレスを指定すると仮定します。しかし、私はBUFFER_OFFSET(0)が有用なアドレスであるとは思わない。
ありがとうございます。 GL_ARRAY_BUFFERは常に1つしかありませんか?私は2つのGL_ARRAY_BUFFERsmをバインドすると言うと、バッファ[0]とバッファ[1]と言っています。どちらがプログラムを選択しますか? – NoviceCai
@NoviceCai:* Pointer呼び出しを呼び出した時点でバインドされていたものを覚えています。そのため、BindBuffer(a)/ VertexPointer/BindBuffer(b)/ NormalPointerは頂点にバッファーaを使用し、通常の場合はbを使用します – Bahbar
ありがとうございます。私もこのhttp://www.opengl.org/wiki/Vertex_Array_Objectを読んでいます – NoviceCai