1

私は OpenGL (3.x) で最初のステップに取り組んでおり、VAO と VBO を使用していくつかの図形 (三角形、立方体など) を描画する予定です。

今、私は次のセットアップを得ました:

VAO --> VBO [頂点、色] + VBO [インデックス]

「頂点」には [三角形の 3 * 3floats 頂点、立方体の 8*3floats]、「色」には頂点ごとの RGB (アルファなし)、「インデックス」には [ 三角形: 0,1,2、正方形: 0,1 ,2, 0,2,3, ...]

「glDrawElements」を使用して描画するとします。シリーズの最初の図が正しく描画されている (そして正しい色が得られている) だけで、2 番目の図は正常に機能しません。

したがって、三角形のデータを最初にレンダリングすると、次のようになります。

三角形の次に立方体

最初に立方体をレンダリングすると、次のようになります。

立方体の次に三角形

注:三角形は赤、立方体はカラフルなので、最初の図は常に期待どおりに表示されます

これは、drawElements の代わりに "glDrawArrays" (オフセット + 三角形カウント) を使用して配列を描画しても問題なく機能しましたが、もちろん、インデックスを作成すると、データ配列がはるかに小さくなります。だから私はその動きをしたかった。

どうすれば同じセットアップを描画できますが、インデックスを作成できますか? 別のメソッドを呼び出す必要がありますか?

これは、疑問がある場合に備えて、VBO のデータを準備するために使用するコードです。

// VBOS solid
    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat),&vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[1]);
    glBufferData(GL_ARRAY_BUFFER, colors.size()*sizeof(GLfloat),&colors[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vboIndex );
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint),&indices[0], GL_STATIC_DRAW);
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );

そして、これは私がレンダリング時に行う呼び出しです。このループでは、三角形は indexCount=3 & offset=0 になり、立方体はそれぞれ 24 & 3 になります。

glDrawElements(
   GL_TRIANGLES,      
   primitives[i]->indicesCount,    
   GL_UNSIGNED_INT,  
   (void*) (primitives[i]->offsetIndices*sizeof(GLuint))   
);
4

1 に答える 1

1

投稿後もまだテストしていたので、最終的に次を使用して作業を試みました。

glDrawElementsBaseVertex(
   GL_TRIANGLES.
   __INDICES_TO_RENDER__,
   GL_UNSIGNED_INT,
   (void*) (__INDICES_RENDERED___*sizeof(GLuint)),
   _VERTICES_RENDERED_BEFORE_   
);

ここで、「INDICES_TO_RENDER」と「INDICES_RENDERED_」は 3f をカウントする値であるため、立方体の場合、値「TO_RENDER」として 24floats を使用し、「_RENDERED」には 0 を使用します。

「_VERTICES_RENDERED_BEFORE_」は、レンダリングされた頂点の人間の値として機能したため、立方体がレンダリングされる前は 0 であり、レンダリングされた後は 8 になるはずです。

ちょっと奇妙です(おそらく私は何か間違ったことをしました)が、私のテストではうまくいきました:

うーん

Using an offset with VBOs in OpenGLで言われましたが、呼び出しに何を入れるかが見つかるまで何度か試しました。

専門家がこれを検証できれば、私はもっと幸せになるでしょう:P.

于 2013-01-30T21:43:03.367 に答える