1

に問題があり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、コアプロファイルを使用しています)

4

1 に答える 1

4

この関数を正しく使用していません:

glDrawRangeElements(prim, start, end, (end - start) + 1, iformat, NULL);

の 2 番目と 3 番目のパラメーターは、インデックス配列のサブ範囲を指定するためのものでglDrawRangeElements()はありません。それらは、その描画呼び出し中に使用する頂点インデックスを事前に GL に通知するため、頂点配列でサブ範囲を指定しています。countおよびパラメータを使用して、レンダリングするインデックス配列の部分を指定する必要がありindicesます。

簡単に使用できます

glDrawElements(prim, (end - start) + 1, iformat, (GLvoid*) (sizeof(yourElementType)*start) );

を使用する場合はglDrawRangeElements()、各オブジェクトが使用する頂点配列の範囲をさらに追跡する必要があります。

于 2014-04-30T22:27:13.323 に答える