0

レンダリングする必要があるレベルがあります。何百ものサブメッシュに分割され、どのサブメッシュがどのサブメッシュを認識できるかに関する情報が含まれています。各レベルには、これらすべてのサブメッシュが参照できるテクスチャのプールがあります。すべてのサブメッシュには、テクスチャ別にソートされた頂点があります。ここに例があります。

サブメッシュ 1

インデックス[1, 3, 4, 5, 6, 2, 7, 8, 10...] テクスチャ 1

インデックス[12, 15, 16, 12, 13, 19] テクスチャ 2

1000 のサブメッシュと 20 のテクスチャが可能な場合、可視性を考慮しても、テクスチャのスワップの量はばかげています。

すべてのサブメッシュを VBO に順番に配置しています。レンダリングを最適化し、不要なテクスチャ スワップをすべて排除する最善の方法を見つけようとしています。VBO をソートすると、サブメッシュ接続が失われ、可視性データが役に立たなくなります。または、それを行うより良い方法はありますか?

または、可視性に基づいてフレームごとにインデックス リストを作成する必要がありますか、それとも遅すぎますか?

編集:これが私の現在のセットアップの内訳です。

サブメッシュ 1 テクスチャ 1、サブメッシュ 1 テクスチャ 2 からサブメッシュ n、テクスチャ n まで、すべての頂点を順番に実行する VBO。

私は、同じ相対的な順序で、すべてのメッシュへのすべてのインデックスである IBO を持っています。

レンダリングするとき、サブメッシュを参照し、そのサブメッシュとテクスチャの IBO の開始インデックスである開始インデックスとカウントを取得し、次にそのテクスチャを持つ数であるカウントを取得します。

これが本質的に、私が非常に多くのスワッピングを行っている理由であり、それが実際に物事を遅くしています。

4

3 に答える 3

5

サブメッシュ 1 テクスチャ 1、サブメッシュ 1 テクスチャ 2 からサブメッシュ n、テクスチャ n まで、すべての頂点を順番に実行する VBO。

問題があります。「サブメッシュ」は、複数のレンダリング コールではなく、単一のレンダリング コールである必要があります。各「サブメッシュ」は、「サブメッシュ X、テクスチャ Y」のペアに相当する必要があります。特定のサブメッシュは、特定の一連の呼び出し、呼び出し、および単一の呼び出しを使用してレンダリングします。glVertexAttribPointerglBindTextureglDrawElements

このスキームの各サブメッシュは、特定のテクスチャを使用します。したがって、使用するテクスチャによって描画順序を並べ替えることができます。したがって、テクスチャ 1 を使用するすべてのサブメッシュは、glBindTextureそれらの間で 1 回の呼び出しだけで同時にレンダリングできます。

最高のパフォーマンスを得るには、すべての「サブメッシュ」が同じバッファーを使用するため (したがって、すべてが同じ頂点フォーマットを使用するのは良い変更です)、特定の「サブメッシュ」をレンダリングするのではなく、を使用glDrawElementsBaseVertexしてレンダリングするようにしてください。サブメッシュごとに個別のglVertexAttribPointer呼び出し。

VBO を効果的に 1 つの長い配列にし、すべてのサブメッシュの頂点を同じ配列にするという考え方があります。各サブメッシュは、インデックス データへのベース オフセット、レンダリングする頂点の数、ベース頂点オフセットを格納します。これは、そのサブメッシュのデータが大きな配列で開始するインデックスを表します。

すべてのサブメッシュのレンダリングの開始時に、1セットのglVertexAttribPointer呼び出しを行います。そして、それはちょうどglBindTextureそれglDrawElementsBaseVertexからです。glVertexAttribPointerサブメッシュごとに呼び出す必要はありません。BaseVertex を使用して、各サブメッシュのデータが VBO のどこから来るかを定義します。

于 2013-05-14T08:44:09.580 に答える