OpenGL ESでクワッドを描画する最速の方法は?


21

OpenGL ES 2.0を使用しています。描画するクワッドがたくさんあります。GL_QUADSを使用しているかのように、クワッドあたり4つの頂点のみを渡すことができるようにしたいのですが、基本的には、独立したクワッドの束。

これまでのところ、私ができることを見つけました:-GL_TRIANGLES(クワッドあたり6頂点)-GL_TRIANGLE_STRIP(クワッドあたり6頂点)を縮退します

私が見つけた可能性:クアッドストリップをリセットする特別なインデックス値を持つ-GL_TRIANGLE_STRIPS(これはクアッドごとに5つのインデックスを意味しますが、これはOpenGL ES 2.0で可能だとは思いません)

回答:


33

インデックスバッファとGL_TRIANGLESを使用するだけです。この場合、4つの頂点とクワッドごとに6つのインデックスが必要です(6つの追加インデックスは大きなオーバーヘッドに聞こえるかもしれませんが、実際にはそうではありません-インデックスバッファを構築したら、再度タッチする必要はありません)。詳細については、このページを参照してください(glDrawElementsを検索)

簡単なサンプルコード:

GLfloat vertices[] = {-1, -1, 0, // bottom left corner
                      -1,  1, 0, // top left corner
                       1,  1, 0, // top right corner
                       1, -1, 0}; // bottom right corner

GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
                     0,2,3}; // second triangle (bottom left - top right - bottom right)

glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

また、1つのクワッドだけを描画する場合、トライアングルストリップで描画するために必要な頂点は4つだけです(ウィキペディアに表示されています)が、すでにこれを知っていると思います。


複数の三角形ストリップを単一のストリップにマージするための伝統的なトリックは、「縮退三角形」です。1つのストリップの最後の要素と次のストリップの最初の要素を繰り返すと、面積がゼロの2つの三角形が作成され、何も描画されません。2番目のクワッドインデックス(4、5、6、7)を検討します。2つのクワッドのGL_TRIANGLE_STRIPのインデックスバッファーは、{0、1、2、3、4、5、6、7 3, 4,}です。縮退三角形がある3,3,43,4,4。これをする価値はありますか?いいえ、四角形が共通のエッジを持つペア(またはそれ以上)になる傾向がある場合を除きます。2番目のクワッドが{3、2、4、5}の場合、ストリップは{0,1,3,2,5,4}です。
ToolmakerSteve 14

8
そして、一緒に来て、大腿四頭筋の束を描画する必要がある人に、これは明確にするために:パフォーマンスのために、DOは、NOT上記のコードをコピーして、glDrawElementsを呼び出す作る各クワッドに一度。代わりに、1つの頂点配列と、描画するすべての四角形を含む1つのインデックス配列を作成します。GL_TRIANGLESを使用して、2つのクワッドは、インデックスを持つことができる{0,1,2, 0,2,3, 4,5,6, 4,6,7}か、同様に良いです{0,1,2, 2,3,0, 4,5,6, 6,7,4}。これを助けるために良いクラスですglText-のAndroid / SpriteBatch
ToolmakerSteve

6

Appleのドキュメント「最高のパフォーマンスを得るには、glDrawArraysを使用して単一のインデックスなしの三角形ストリップとしてモデルを送信する必要があります」に示されているように、インデックスバッファの使用は必ずしも高速ではありません。

そのため、a GL_TRIANGLE_STRIPはインデックスバッファを必要とせずに4つの頂点でそれを行います、インデックスバッファを使用することはできますが、2つの頂点を「保存」しようとするのはかなり苦手です。このため、2つを別々に描画GL_TRIANGLESし、対角線上の2つの頂点を繰り返すことをお勧めします


8
いいえ。その文書は、モデルは単一のINDEXED三角形ストリップとして提出されると言っています。次の文は、「頂点バッファーで同じ頂点のデータを複数回指定しないようにするには、別のインデックスバッファーを使用し、glDrawElements関数を使用して三角形ストリップを描画します」です。あなたが決定したのはまさに「ラメ」でした。
davidf2281 14年

3
doc段落がglDrawArraysではなくglDrawElementsを参照するようになったことを考えると、おそらくこの回答以降に書き直されました。それでも、ドキュメントの目的は、パフォーマンスのために、単一のストリップを提供することでした(複数のストリップではなく、複数のgl呼び出し)。この状況では、インデックスを使用するかどうかの違いは重要でないと考えています。重要なのは、すべてを単一の頂点配列(およびオプションのインデックス配列)に入れて、単一のgl呼び出しを行えるようにすることです。
ToolmakerSteve 14

0

デスクトップでの大きなメリットは、データをGL_STATIC_DRAW VBOに移動することです。おそらくこれはiPhoneのMBX GPUにも当てはまります。


-2

GL_TRIANGLE_FANクワッドに使用すると、6ではなく4つの頂点が使用されます。


うん、でもそうGL_TRIANGLE_STRIPだ、他の答えがすでに指摘しているように。
アンコ14

@氏。Blah-質問のポイントを見逃しています。それは、クワッドのを効率的に行う方法です。各クワッドに対してgl呼び出しを行うのではなく、多くのクワッドを単一の配列に結合し、単一のgl呼び出しで描画することができます。GL_TRIANGLE_FANはこれには役立ちません。したがって、高性能レンダリングではほとんど役立ちません。
ToolmakerSteve 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.