web-dev-qa-db-ja.com

OpenGL-インデックスにGL_ELEMENT_ARRAY_BUFFERがあるのはなぜですか?

私は現在OpenGLES 2.0レルムを初めて使用しているので、バインディング、バッファー、シェーダーなどについてできるだけ理解したいと思います。

今のところ、私はGL_ELEMENT_ARRAY_BUFFERGL_ARRAY_BUFFERの違いと、記載されている各プリセットをいつ使用するかを理解しようとしています。

私の現在の理解では、GL_ELEMENT_ARRAY_BUFFERは特に前述の三角形のインデックス用であり、他の三角形は他のすべてのものであると信じています。

誰かが理由とこれが正しいかどうかについて詳しく説明してもらえますか? GL_ELEMENT_ARRAY_BUFFERはどのように異なる方法で処理されますか?

17
TheCodingArt

GL_ELEMENT_ARRAY_BUFFERは、表示しているバッファに「その他」の各要素のインデックスが含まれていることを示すために使用されます(GL_ARRAY_BUFFER)バッファ。

したがって、頂点のみ(他のデータはない)の非常に基本的な例として、インデックスバッファがある場合:

{0, 1, 2} {0, 2, 3}

データバッファには次のものが含まれます。

{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}}

次に、glDrawElementsを呼び出すと、最初の三角形の頂点0、1、2を選択し、次に2番目の三角形(つまり、基本的に正方形)の頂点を選択することがわかります。

これは、多くの頂点と面を持つより複雑なモデルがある場合に、より便利になります。多くの面が同じ頂点を共有するためです(したがって、同じデータを「再送信」する必要はありません)。

注:上記の例は頂点のみを示しています-そこに好きなだけデータをインターリーブできます(頂点の色、法線、テクスチャ座標など)。

24
goatherder

これには主に歴史的な理由があります。 VBOがなかったとき、glVertexPointerなどで指定されたポインターは、いかなる種類のOpenGLオブジェクトにも「関連付け」られていませんでした。 VBOが導入されたとき、この動作はVBOのセマンティクスに引き継がれ、インデックスと属性に異なるバッファーターゲットが必要でした。

一般的な頂点属性の導入により、このような関連付け機能が追加されました。

今日では、OpenGL実装にとって、データフローをそれに応じて最適化するために、データがどのようにアドレス指定されるかを知ることがほとんどのヒントになります。しかし、それはまた、現在取り扱われていることをプログラマーに精神的に思い出させるものとしても機能します。

13
datenwolf