に問題がありglDrawRangeElements()
ます。基本的に、特定のモデルのすべてのメッシュを同じ頂点/インデックス バッファーに保持し、glDrawRangeElements()
それらを選択的に描画するために使用します (必要に応じて、描画ごとにマテリアルなどを変更します)。
モデル内でメッシュを描画するために使用する関数は次のとおりです。
void Mesh::drawMesh(uint index)
{
if (index >= subMesh.size()) return;
va.drawRange(subMesh[index].start, subMesh[index].end);
}
どこva.drawRange()
にある:
void VertexArray::drawRange(unsigned int start, unsigned int end)
{
if (ready == false)
return;
/* Bind our vertex array */
bindArray();
/* Draw it's contents */
if (ibo == 0)
glDrawArrays(prim, start, (end - start) + 1);
else
glDrawRangeElements(prim, start, end, (end - start) + 1, iformat, NULL);
unbindArray();
}
subMesh[i].start は、サブメッシュの最初のインデックスです。subMesh[i].end は最後のインデックスです。これらの値は、メッシュのインポート中に決定されます (assimp を使用)。
subMesh[i].start = (uint)indices.size();
for (uint j = 0; j < mesh->mNumFaces; ++j)
{
aiFace& face = mesh->mFaces[j];
indices.push_back(face.mIndices[0] + vertexOffset);
indices.push_back(face.mIndices[1] + vertexOffset);
indices.push_back(face.mIndices[2] + vertexOffset);
}
subMesh[i].end = (uint)indices.size() -1;
vertexOffset += mesh->mNumVertices;
このコードは、assimp インポートを行うシーン内のすべてのメッシュに対して実行されます。
私が抱えている問題は、subMesh[0] と subMesh[1] に異なる値が含まれていても、drawMesh(0) と drawMesh(1) が同じものを描画することです (具体的には、subMesh[0] には start = 0 と end = があります)。 35、subMesh[1] は start = 36 および end = 71 です)。を使用してメッシュ全体を一度に描画すると、glDrawElements()
両方のサブメッシュが適切に描画されるため、頂点とインデックス データが正しいことがわかります。
私は何を間違っていますか?
(PS。OpenGL 3.3、コアプロファイルを使用しています)