0

OpenGL で VBO と IBO を使用していますが、正しく描画できません。フレーム表示機能で忘れていた可能性があることを教えてください。- struct Point3D は、(x,y,z) 内に 3 つの float を持つ構造体です。- nbVertex は、glVertex 配列内の頂点の量です。- nbVBOInd は、VBOInd 配列内のインデックスの量です。

    glGenBuffers(1, &VertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(struct Point3D)*nbVertex, glVertex, GL_STATIC_DRAW);

    glGenBuffers(1, &IndexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(glVertex), BUFFER_OFFSET(0));   //The starting point of the VBO, for the vertices

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   //The starting point of the IBO

ありがとう !

4

2 に答える 2

3

Rodrigo と同じ問題が発生します。ここでわかるように、データ型の不一致があります。

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

sizeof(int) - 整数型を使用

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   

GL_UNSIGNED_SHORT - 短い型を使用

openGL 仕様によると、glDrawElements で使用できるのは符号なしのデータ型のみです。これを修正するには、次のものが必要です。

  • 次のような宣言で VBOInd を unsigned 型に変更します。

    unsigned int* VBOInd = new unsigned int[nbVBOInd]

  • 6番目の呼び出しを

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

  • 11番目(最後の)の呼び出しを

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

とにかく、問題はポインターのセットアップに隠されていると思います。9番目の呼び出しを次のように変更します。

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

それが機能しない場合は、glVertex と VBOInd がどのように宣言され、データが入力されているかを示してください。多分あなたは std::vector を使用していますか?これらのデータ コンテナーを次のように呼び出す必要があります。

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, &VBOInd[0], GL_STATIC_DRAW);

不明な点がある場合は、コメントで質問してください..

于 2011-08-18T22:24:38.623 に答える
2

最後の行を次のように変更してみてください。

glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

IndexVBOID のデータが非常に短い場合を除き、上記の sizeof(int) は間違っています。

于 2011-08-18T08:26:07.673 に答える