12


8

これは私がしばらくの間調べていたものですが、私はまだ具体的な情報や良い例を見つけることができていません。 私は、例えば、たくさんのつながっていないオブジェクト(たとえば三角形の帯)を持っています。 これらをレンダリングするための効率的な方法は何ですか?

openGLの呼び出しを減らすために1つのVBOに複数のオブジェクトを入れることについて聞いたことがありますが、これを行う方法の適切な例は見ていません。 私はこの考えと矛盾する記事も見ました。 だから今、私はほとんど混乱しています。

2 Answer


16


まず最初に、あなたはおそらくVBOをいつも使うべきです。 小さいものと大きいものに。

次に、2つ目の問題は、「いくつかの別々のオブジェクトを1つの大きなオブジェクトに結合する方法」です。 - そうする必要があるOpenGL呼び出しの数を減らすため。 一般に、同じテクスチャ、マテリアル設定、およびシェーダを使用するオブジェクトを組み合わせることができます。 例えば。 たくさんの同一の箱が横になっている場合、それらをいくつかの大きな「箱箱」にまとめるのが理にかなっているかもしれません。

オブジェクトが三角形リストの場合は、結合は簡単です - ソースリストから大きな三角形リストを作成するだけです。 オブジェクトが三角形のストリップの場合は、ストリップを結合するために「三角形の縮退」を使用する必要があります(単一のストリップとして表現できない場合、これは単一のオブジェクトに対しても非常に便利な最適化です)。

「縮退三角形」は、2つまたは3つの同一の頂点インデックスを持つ三角形です。 グラフィックハードウェアはそれらを認識して非常に速くスキップすることができます。

あなたが持っているのであれば、例えば それぞれ1つの三角形を持つ2つのストリップ、合計6つの頂点。

ストリップの元の三角形のインデックスは次のようになります。

1)0、1、2 2)0、1、2

これで、すべての頂点を結合したので、6つの頂点になります。

1)0、1、2(変更なし)2)3、4、5

これまでに1つの頂点配列がありましたが、それでも2つの別々のストリップがあります。 縮退三角形を挿入してそれらを結合する必要があります。

1)0、1、2、2、2、3、4、5

(上記は正しいと思いますが、実際には検証されていません)

考えはこれです:上のストリップで、グラフィックスカードはこれらの頂点から三角形を描くでしょう:

0、1、2 1、2、2 < - 縮退します。 描画されません2、2、2 < - 縮退! 描画されません2、2、3 < - 縮退! 描かれません3、4、5

一般的には、元のストリップの長さに基づいて2つか3つの縮退した三角形を挿入する必要があります。その結果、三角形の巻きは正しくなります。


1


http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawelements.html[glDrawElements()]を調べてください。それはあなたが望むことを達成するための良い方法の一つです。 データが各フレームを変更するとパフォーマンスが低下する可能性があることに注意してください。データの関連部分を更新する必要があるため、グラフィックカードのメモリにコピーする必要があります。 静的データの場合、これは非常に高速です。