12

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

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

4

2 に答える 2

17

まず、おそらく常に VBO を使用する必要があります。小さいものから大きいものまで。

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

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

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

したがって、たとえば、それぞれ 1 つの三角形を持つ 2 つのストリップがある場合、合計 6 つの頂点になります。

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

1) 0, 1, 2
2) 0, 1, 2

すべての頂点を結合すると、最終的に 6 つの頂点になります。

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

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

1) 0, 1, 2, 2, 2, 3, 4, 5

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

アイデアは次のとおりです。上記のストリップを使用すると、グラフィックス カードはこれらの頂点から三角形を描画します。

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

一般に、元のストリップの長さに基づいて 2 つまたは 3 つの縮退三角形を挿入する必要があるため、三角形の巻きが正しく維持されます。

于 2009-01-28T13:40:49.433 に答える
1

glDrawElements()を調べてください。これは、目的を達成するための良い方法の 1 つです。フレームごとにデータが変更されると、パフォーマンスが低下する可能性があることに注意してください。これは、データの関連部分を更新する必要があるためです。これは、データをグラフィック カードのメモリにコピーすることを意味します。静的データの場合、これは非常に高速です。

于 2009-01-28T11:21:00.243 に答える