19

私は現在OpenGLES2.0レルムに不慣れであり、バインディング、バッファー、シェーダーなどについてできるだけ理解したいと思います。

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

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

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

4

2 に答える 2

29

GL_ELEMENT_ARRAY_BUFFERGL_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番目の三角形(つまり、基本的に正方形)の頂点を0、2、3として選択します。

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

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

于 2013-02-27T07:53:03.593 に答える
14

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

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

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

于 2013-02-26T17:20:15.797 に答える