私は 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))
);