4

より多くのfpsを取得するために、レンダリングコードにVBOを設定しようとしています。頂点の位置、色、テクスチャの座標について個別のVBOで機能しましたが、インターリーブされた頂点データに転送した後、ジオメトリのレンダリングは行われません。これが私のセットアップ機能です:

const GLsizeiptr data_size = NUMBER_OF_CUBE_VERTICES * 9 *sizeof(float);
// allocate a new buffer
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ARRAY_BUFFER, data_size, data, GL_STATIC_DRAW);

float* ptr = (float*)data;
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 0));
glEnableVertexAttribArray(ATTRIB_VERTEX);

glVertexAttribPointer(ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 3));
glEnableVertexAttribArray(ATTRIB_COLOR);

glVertexAttribPointer(ATTRIB_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 7));
glEnableVertexAttribArray(ATTRIB_TEXCOORD0);

glGenBuffers(1, &cubeIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, NUMBER_OF_CUBE_INDICES*sizeof(GLubyte), s_cubeIndices, GL_STATIC_DRAW);

データ配列は次のようになります。

static float data[] =
{
//  position  //   // color // //UV//
-1.0, +1.0, +1.0,  255,0,0,255, 0,0,
-1.0, -1.0, +1.0,  0,255,0,255, 0,0,
+1.0, +1.0, +1.0,  255,0,255,255, 0,0,
+1.0, -1.0, +1.0,  255,0,0,255, 0,0,

+1.0, +1.0, +1.0,  255,0,0,255, 0,0,
+1.0, -1.0, +1.0,  255,0,0,255, 0,0,
+1.0, +1.0, -1.0,  255,255,0,255, 0,0,
+1.0, -1.0, -1.0,  255,0,0,255, 0,0,

+1.0, +1.0, -1.0,  255,0,255,255, 0,0,
+1.0, -1.0, -1.0,  255,255,0,255, 0,0,
-1.0, +1.0, -1.0,  0,255,0,255, 0,0,
-1.0, -1.0, -1.0,  255,0,0,255, 0,0,

-1.0, +1.0, -1.0,  0,0,255,255, 0,0,
-1.0, -1.0, -1.0,  255,0,0,255, 0,0,
-1.0, +1.0, +1.0,  255,255,0,255, 0,0,
-1.0, -1.0, +1.0,  255,0,0,255, 0,0,
};

そしてこれは私のレンダリングコードです:

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIBO);
glDrawElements(GL_TRIANGLE_STRIP, NUMBER_OF_CUBE_INDICES, GL_UNSIGNED_BYTE, s_cubeIndices);

また、インデックスバッファなしでDrawArrays関数を使用しようとしましたが、結果は同じで、ジオメトリはレンダリングされませんでした。プログラムの実行中、出力ウィンドウにGLError1282も表示されます。私の問題について助けていただければ幸いです、ありがとう。

4

2 に答える 2

4

バッファ オブジェクトを使用している場合、glVertexAttribPointer の最後のパラメータは、必要なデータにオフセットする必要があります。たとえば、あなたの ATTRIB_VERTEX 配列はオフセット 0 から始まり、ATTRIB_COLOR 配列はオフセット sizeof(float) * 3 (位置は 3 つの浮動小数点数を取るため) などになります。

バッファ オブジェクトではなく頂点配列を使用している場合は、現在バインドされているバッファ オブジェクトを GL_ARRAY_BUFFER ターゲットにバインド解除する必要があります。

glBindBuffer(GL_ARRAY_BUFFER, 0);
于 2012-10-02T14:10:22.697 に答える
0

OK、glVertexPointer関数とglEnableClientState関数を使用して動作させました。ただし、glVertexAttribPointerおよびglEnableVertexAttribArrayの場合、何らかの理由でジオメトリのレンダリングはまだ行われません。これで、コードは次のようになります。VBO init:

struct Vertex
{
  GLfloat x, y, z;
  GLubyte r, g, b, a;
};
......

const GLsizeiptr data_size = NUMBER_OF_CUBE_VERTICES *sizeof(struct Vertex);
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);

glBufferData(GL_ARRAY_BUFFER, data_size, vertices, GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex), (GLvoid*)((char*)NULL));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(struct Vertex), (GLvoid*)offsetof(struct Vertex, r));
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

レンダリング:

glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, NUMBER_OF_CUBE_VERTICES);

glVertexAttribPointer / glEnableVertexAttribArrayに切り替えると、なぜこのコードが機能しないのかわかりません。何か案は?たぶん、ポインティングと有効化関数を初期化部分からレンダリング部分に移動する必要がありますか?

于 2012-10-02T19:52:56.453 に答える