3

VBO を使用して、通常の 2D テクスチャ付きの正方形を FBO にレンダリングしようとしています。即時モード機能は問題なく動作しますが、この VBO は機能しません。GL_TEXTURE_2D はコードに対して既に有効になっています。それの何が問題なのですか?

unsigned int VBOid = 0;
unsigned int Iid = 0;

float *geometry;
unsigned int *indices;

int num_geometry = 1;
int num_vertices = 4;
int num_indices = num_geometry*num_vertices;
geometry = new float[num_geometry*num_vertices*4];
indices = new unsigned int[num_indices];

indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 3;

/* Fill geometry: 0, 1, = vertex_xy
*                2, 3 = tex_coord_uv
*/
geometry[0] = 0.0f;
geometry[1] = 0.0f;
geometry[2] = 0.0f;
geometry[3] = 0.0f;

geometry[4] = 50.0f;
geometry[5] = 0.0f;
geometry[6] = 1.0f;
geometry[7] = 0.0f;

geometry[8] = 50.0f;
geometry[9] = 50.0f;
geometry[10] = 1.0f;
geometry[11] = 1.0f;

geometry[12] = 0.0f;
geometry[13] = 50.0f;
geometry[14] = 0.0f;
geometry[15] = 1.0f;

glGenBuffers(1, &VBOid);
glBindBuffer(GL_ARRAY_BUFFER, VBOid);
glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), geometry, GL_STATIC_DRAW);

glGenBuffers(1, &Iid);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Iid);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

//GL_TEXTURE_2D is already enabled here
//Buffers are already bound from above

glBindTexture( GL_TEXTURE_2D, 2); //I used 2 just to test to see if it is rendering a texture correctly. Yes, 2 does exist in my program thats why i arbitrarily used it
//glClientActiveTexture(GL_TEXTURE0); I dont know what this is for and where to put it

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glActiveTexture(GL_TEXTURE0); same here I dont know what this is for or where to put it
glVertexPointer(2, GL_FLOAT, sizeof(GLfloat)*4, 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*4, (float*)(sizeof(GLfloat)*2));

glDrawElements(GL_QUADS, num_indices, GL_UNSIGNED_INT, indices);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
4

1 に答える 1

3

問題は、呼び出し内でsizeof(geometry)の使用法(および同じ)です。これらの変数は、動的に割り当てられた配列(コンパイラーが認識していない)を指しているかどうかに関係なく、実際には単なるポインターです。したがって、常にポインタのサイズを取得します(プラットフォームに応じて、4バイトまたは8バイト)。indicesglBufferData

sizeof(geometry)に置き換えます。num_geometry*num_vertices*4*sizeof(float)_ 実際、ここではインデックスはまったく必要なく、単純なもので全体を描くことができます。sizeof(indices)num_indices*sizeof(unsigned int)

glDrawArrays(GL_QUADS, 0, 4);

実際の(コンパイル時のサイズの)配列と、動的に割り当てられた配列を指す単なるポインターとの違いに常に注意してください。その結果、sizeof演算子はそれらの違いの1つになります(後者のメモリを解放するための要件は、delete[]後のある時点で、別の、しかしそれほど重要ではない違いがあります)。

于 2012-10-26T07:21:41.060 に答える