OpenGLの:ジオメトリのバッチをレンダリングするための効率的な方法はありますか?

StackOverflow https://stackoverflow.com/questions/487244

  •  20-08-2019
  •  | 
  •  

質問

これは、私はしばらくの間に探していたものですが、私は、任意の具体的な情報や良い例を見つけるためには至っていません。私は、たとえば、未接続のオブジェクト(例えば三角形ストリップ)の束を持っています。これらをレンダリングするための効率的な方法は何ですか?

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

役に立ちましたか?

解決

まず最初に、あなたはおそらくVBOのすべての時間を使用する必要があります。小規模および大規模なオブジェクトの場合ます。

次に、第二の問題は、「一つの大きなオブジェクトにいくつかの別々のオブジェクトをどのように組み合わせるか?」です - そう行わなければならないのOpenGL呼び出しの回数を減らすために。一般的に、同じテクスチャ(複数可)を使用するオブジェクト、材料の設定とシェーダを組み合わせることができます。例えば。あなたが転がっ同じ箱のトンを持っている場合、それはいくつかのより大きな「クレートの山」にそれらを結合する意味があります。

オブジェクトは、その後組み合わせ、三角形リストの場合は簡単です - ちょうどソースリストのうちの大三角形のリストを作成します。オブジェクトは、三角形ストリップである場合は、(それが単一のストリップとして表すことができないならば、これは、同様に単一のオブジェクトのための非常に便利な最適化です)ストリップを結合するために、「縮退三角形を」使用する必要があります。

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

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

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

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

さて、あなたは6つの頂点で終わるので、一緒にすべての頂点に参加します。

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

今では、あなたは一つの頂点配列が、それでも二つの別個のストリップを持っています。縮退三角形を挿入することによって、それらを結合する必要があります:

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
三角形の巻線が正しいままであるように、

一般的なケースでは、あなたは、元のストリップの長さに基づいて、二、三縮退三角形を挿入しなければならないのいずれか

他のヒント

glDrawElements()の中に見てA>、それはあなたが望むものを達成するための一つの良い方法です。あなたは、グラフィックスカードのメモリにコピーを意味し、データの関連部分を更新する必要があるため、あなたのデータは、各フレームを変更した場合、パフォーマンスが低下場合があります。静的データの場合、これは非常に高速です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top