4

OpenGL で描画するには、頂点の配列を指定してから、頂点の配列を結合してプリミティブの理にかなった順序にするインデックスを指定します。glDrawElements でこれを行うことができます。頂点を指定するには、glVertexPointer を使用できます。このパラメーターでは、パラメーター「ストライド」を指定できます。これは、配列内の連続する要素間のギャップです (つまり、他のデータを含む構造体に頂点を格納する場合、ストライドして他のデータを飛び越えます)。 )。

これは素晴らしいことですが、今はフェイス構造体でインデックスを指定するAssimpを使用しています。

struct aiFace {
    unsigned int* indices;
    unsigned int numIndices; 
}

おそらく、これは異なるサイズの面を持つメッシュ (三角形と四角形を持つメッシュ) をサポートするためです。Assimp は、すべてのメッシュを三角測量するオプションを備えているので、すべての面が同じプリミティブであることを保証できます。

したがって、私が本当に欲しいのは、インデックスをまたぐことができるようにすることです。

gl/*...uh...*/ElementPointer(
    3, 
    GL_UNSIGNED_INT, 
    sizeof(unsigned int) /* skip past the num_indices field*/, 
    &faces[0]);

しかし、私はそれを行う方法を理解できません。glDrawElements は、インデックスが連続した配列であることを前提としています。OpenGLでこれを行う方法はありますか?

4

2 に答える 2

3

申し訳ありませんが、お探しの OpenGL への組み込みはサポートされていません。ただし、Assimp によってロードされたデータ (頂点データと要素配列の両方) を VBO にコピーする必要があるため、そのステップで必要な再配置を行うことができます。

ところで:ストライドは、要素の終わりから次の要素の始まりまでのオフセットではなく、要素の始まりの間のオフセットを示します。

于 2013-09-30T12:39:57.603 に答える
1

あなたの最善の策は、メッシュを三角測量することです。これにより、すべてを一度に描画できますGL_TRIANGLES(または、マテリアル/テクスチャなどを交換することを考慮して可能な限り)。

異なるサイズのポリゴンが本当に必要な場合は、可能です。私はそれが非常に速いとは思わGL_TRIANGLE_FANないし、常に素晴らしい結果をもたらすとは限らない三角形分割を行うために使用する必要があると思います(例えば、対角線に沿ってクワッドを分割するなど)。とにかく、答え:

glPrimitiveRestartIndexおそらく と で問題なく動作しglDrawElementsますGL_TRIANGLE_FANが、実際には自分自身を三角測量するのが最善です。

glMultiDrawElementsも可能です(実際には「gl ... ElementPointer」のアイデアと非常に似ています)が、おそらくglPrimitiveRestartIndex よりも遅くなります

編集別の選択肢は ですがglDrawElementsIndirect、一見したところ、これは よりもオーバーヘッドが大きくなる可能性がありますglPrimitiveRestartIndex

于 2013-09-30T12:53:45.263 に答える