1

2 つの異なるモデルの頂点データを格納する構造体があります。1 つは立方体で、もう 1 つはピラミッドです。

struct Model{
    GLuint vboID;
    GLfloat* vbo;
    GLuint vaoID;
    GLfloat* vao; 
    GLuint vertexStart;
    GLuint vertexCount;
};

vbo を作成し、次のようにバッファーを生成します。

Model cubeModel;
Model pyramidModel;

cubeModel.vbo = cubeVerts; //A GLfloat array I created earlier in code earlier. 
cubeModel.vertexCount= sizeof(cubeVerts);//size of the GLfloat array in bytes

pyramidModel.vbo = pyVerts; 
pyramidModel.vertexCount= sizeof(pyVerts);

glGenBuffers(1, &cubeModel.vboID); //Generate a buffer for the vertices
glBindBuffer(GL_ARRAY_BUFFER, cubeModel.vboID); //Bind the vertex buffer
glBufferData(GL_ARRAY_BUFFER, cubeModel.vertexCount, cubeModel.vbo, GL_STATIC_DRAW);

そして、私が使用する描画する:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, cubeModel.vertexCount);
glDisableClientState(GL_VERTEX_ARRAY);

どちらが機能し、立方体をうまく描画できますが、ピラミッドを描画する方法も複数試しています。

両方を同時に画面に表示するにはどうすればよいですか?

編集:ここで私が具体的に試したのは、glBufferData() 呼び出しを複製してピラミッド データを渡し、次に glDrawArays(GL_TRIANGLES,0,cubeModel.drawcount+pyramidModel.drawCount) を作成して、頂点データがスタックし、glDrawArrays がすべて通過することです。ジオメトリは一度に渡されました。

また、glGenBuffers() から glDisableClientState() までの 2 セットの命令を作成しようとしましたが、代わりにすべてのピラミッド モデルのデータを使用しました。私のglDrawArraysは次のとおりだったので、これは興味深いものでした。

glDrawArrays(GL_TRIANGLES, 0, cubeModel.drawCount);
glTranslatef(4.0f,0.0f,0.0f);
glDrawArrays(GL_TRIANGLES, 0, pyramidModel.drawCount);

そして、本当にめちゃくちゃなピラミッドを2回描画することになり、2回目に glBufferData() を呼び出すと、以前に渡されたデータが上書きされると信じるようになりました。

編集 2:Andon のコメントを読んだ後、コードの一部を編集して明確にしました。drawCount は vertexCount になり、m_vertexBuffer は、以前使用していた古いクラス変数を使用する代わりに、cubeModel に保存したハンドルを正しく参照するようになりました。ハンドルを収納。

4

1 に答える 1

2

あなたのコードには多くの問題があるので、コメント セクションを汚したくありません。しかし、今はすべてを確認する時間がないので、これは一種の一時的な回答です。

glBufferData (...)以前に渡されたデータを技術的に上書きすることはありませんが、はるかに悪いことをします。呼び出すたびglBufferData (...)に、渡したサイズの新しいデータ ストアが作成され、(オプションで) 指定したデータが格納されます (NULL 以外のものを渡した場合)。free (...)and を呼び出してからmalloc (...)ordelete [] ...を呼び出すようなものだと考えてくださいnew Type [...]

glBufferSubData (...)は、頂点バッファーに頂点を追加するための推奨される手法です。残念ながら、データ ストアのサイズは変更されません。場合によっては、VBO を過剰に割り当てて、後でデータを提供するのを遅らせると便利です ( を使用glBufferSubData)。

1 つの VBO を使用して両方のモデルを保存する場合、VBO のデータに関連する各モデルの開始頂点と頂点数を知る必要があります。現在わかっているのは頂点の数だけです (そして、 のdrawCount代わりに奇妙な名前が付けられていますvertexCount)。ほとんどの人drawCountにとって、 は含まれる頂点や要素の数ではなく、何かを描画する回数を示します。

への呼び出しのサイズ フィールドはglBufferData (...)、頂点データのバイト単位のサイズであると想定されています。現在、頂点の数を渡しています。おそらくsizeof (YourVertexDataStructure)、個々の頂点 (sizeof (float [3])この場合)のサイズと、この配列に実際に格納されている頂点の数を計算するsizeof (cubeVerts)/のようなものを使用するつもりでした。sizeof (YourVertexDataStructure)次に、渡すサイズは次のようにglBufferData (...)なります: _size * count_

于 2013-09-06T17:13:15.480 に答える