2012-04-09 8 views
0

OpenGLへの呼び出しを減らすための多くの情報がありましたが、パイプラインについて十分理解していません。あなたはVBOを完全な時間に設定できますか?具体的には、このexampleを使用してVBOを設定し、各フレームは描画呼び出しの前に有効化/ポインタ設定を呼び出します。作成時にVBOをイネーブル/ポインタ設定で完全にセットアップできますか?このOpenGL VBOの設定

Data_Init_Func(...) 
{ 
.... 

glGenBuffers(1, &IndexVBOID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW); 
short pindices[YYY]; 
pindices[0]=0; 
pindices[1]=5; 
//etc... 
offsetInByte=0; 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offsetInByte, SizeInBytes, pindices); 

glGenBuffers(1, VertexVBOID); 
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);4 

//data creation and binding 
... 

// Normally it seems like this code is PER FRAME... DOES IT NEED TO BE? 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glVertexPointer(3, GL_FLOAT, 64, BUFFER_OFFSET(0)); 
glNormalPointer(GL_FLOAT, 64, BUFFER_OFFSET(12)); 
glClientActiveTexture(GL_TEXTURE0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); //Notice that after we call    
glClientActiveTexture, we enable the array 
glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(24)); 
glClientActiveTexture(GL_TEXTURE1); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); //Notice that after we call 
glClientActiveTexture, we enable the array 
glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(32)); 
glClientActiveTexture(GL_TEXTURE2); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); //Notice that after we call 
glClientActiveTexture, we enable the array 
glTexCoordPointer(2, GL_FLOAT, 64, BUFFER_OFFSET(40)); 
... 
} 

Draw(...) 
{ 
glBindBuffer(GL_ARRAY_BUFFER_ARB, VertexVBOID);   // for vertex coordinates 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); // for indices 

// DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE? 

// draw 6 quads using offset of index array 
glDrawRangeElements(GL_TRIANGLES, x, y, z, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); 

... 
} 
+0

最初にinit関数で配列バッファを生成してバインドし、その後バインドした頂点バッファまたは要素バッファが配列バッファに関連付けられるようにします。完了したら配列バッファをアンバインドします。次に、配列バッファを使用するには、自動的にポインタを設定し、配列バッファをバインドします。 – Robinson

答えて

1
// DO I NEED TO CALL THE VERTEX ENABLING/POINTER SETUP HERE? 

はいのような

何か。

アトリビュートはイネーブルではなく、gl*Pointerコールはバッファオブジェクト自体を変更します。。バッファオブジェクトに、位置と法線に使用されていることを伝えません。バッファオブジェクトはダムバイト配列であると考えてください。

gl*Pointerは、そのバイト配列の解釈方法をOpenGLに指示します。それらはバッファに接続されていません。彼らはバッファを変更しません。彼らは、単にOpenGLに特定のバッファ内の特定のデータを見つける場所を指示します。

これらの設定を保存して後でリセットする場合は、vertex array objectが必要です。

関連する問題