0

一部のコード (2D シェイプのアウトライン用のデータの VBO の構築を処理します。つまり、単なる三角形メッシュではなく、任意の長さのポリゴン アウトラインにすることができます) を、プリミティブ再起動の使用から の使用に変換する必要がありましたglMultiDrawElements。実際には自分のアプリケーションにより適していることに気付きglMultiDrawArraysましたが、それは質問とは関係ありません (実際、私が賢く移植してglMultiDrawArrays代わりに使用していれば、この奇妙な問題に遭遇しなかったでしょう)。

必要な値を格納するためのデータを格納するために、2 つのベクトルを組み立てました。

struct E_MDEGBuffer {
    std::vector<GLvoid*> indices;
    std::vector<GLsizei> lengths;
};

indices次に、N個の頂点を持つ各ポリゴンに対して と の両方に単一の値をプッシュし、ポリゴンの最初の頂点に対応するIBOのインデックスをどこに挿入しlengths、その中に頂点の整数を配置しました。ポリゴン。indices(char*)NULL+indexindexlengths

構造体は、次のようにE_MDEGBuffer値を渡すために使用されます。glMultiDrawElements

glMultiDrawElements(GL_TRIANGLE_FAN, mde.lengths.data(), GL_UNSIGNED_INT, (const GLvoid**)mde.indices.data(), mde.indices.size()); 

プログラムをテストしたところ、レンダリングが完全に台無しになりました。

最終的に、渡されたハードコーディングされた値を少しいじるglMultiDrawElementsと、インデックス値が 4 倍ずれていることがわかりました。

例として、最初のポリゴンに 3 つの頂点があり、2 番目のポリゴンに 5 つの頂点があるとします。

正しい結果を得るために、私のindicesベクトルには含まれるもの[0,0xc]lengths含まれるものがあります[3,5]

なぜすべきでindicesはないの[0,0x3]ですか?

4

1 に答える 1

0

OpenGL バッファ関数 ( などglVertexAttribPointer) に提供されるオフセットは、インデックスではなく、常にデータ サイズのオフセットです。

渡される数値はGLvoid*(この場合はGLvoid**) 型である必要がありますが、値はバイト オフセットです。このパラメーターにそのポインター型を使用することがどのように正当化される可能性があるかを考えると役立ちます。バイトオフセット値であることは、(近道では) それに向かっています。

最初はインデックスのオフセットだけだと思った理由はわかりませんが、それは間違っていて、代償を払いました。

于 2012-07-02T01:28:59.993 に答える