4

レンダリングするスプライトがたくさんあるので、この分野でパフォーマンスを向上させた人々からフィードバックを得たいと思っていました。

そこで、シェーダーとテクスチャーで並べ替えます。また、VBO に同じレンダリング設定を持つスプライトのバッチを用意して、レンダリングのためにシェーダーに送信します。すべての通常のもの。私のスプライトはすべて正方形で、中心位置 (P)、方向 (O)、スケール (S)、RGB カラー (Col)、グローバル不透明度 (アルファ) という基本データはすべて同じです。CPU コードの位置と方向を更新する必要があり (ただし、スプライトの約 50% は特定のフレームのペア間で変更されません)、スプライトのスケール、色、不透明度はほとんど変更されませんが、実際には変更されません。

ジオメトリ シェーダーを想定することはできません (サポートしますが、その場合の問題は意味がありません)。

するべきか:

  1. スプライトの位置を更新したら、CPU で頂点の位置を計算します。頂点シェーダーを単純な変換ステップにします。(各フレームを更新するためのデータ量が大幅に少ないという利点がありますが、CPU は多くのトリガーを実行する必要があります)。

  2. POS データを追加データとして VBO に入れ、4 つの頂点に対して複製し、頂点の位置を単純なオフセット (-1,-1; -1,1; 1,1; 1,-1) にして、次のことを行います。シェーダーでのトリガー (GPU がより多くの計算を行うという利点がありますが、各頂点には余分な 5 ワードのデータがあります)。

  3. どちらが優れているかは明らかではないため、両方のアプローチで何が起こるかを確認するためにプロファイリングが必要です。

明らかに私は 3 を行うことができますが、この質問をして、何が高速であるべきかについてのゲシュタルトが不足しているかどうかを確認することは有益だと思いました。いずれにせよ、答えは後で他の真剣なスプライト/パーティクルの実装に役立ちます。

4

3 に答える 3

3

だから私は(3)とプロファイリングをしました。そして、クロネミが言ったように、オプション 2 は説得力のある勝利を収めました。

最高のパフォーマンスを発揮する構造は、次の 2 つの VBO でした。

  1. vec2 float pos, float orientation, float scale(16バイト/頂点)
  2. vec2 float tex, vec4 ubyte color, uint flags(16バイト/頂点)

フラグはスプライトの角をエンコードするため、右は 0x00000001、下は 0x00000002 になります。これにより、コードはスプライトの位置を更新して最初の VBO をウォークスルーし、トリガーやその他のロジックなしで一度に 4 つの値を設定できます。すべての計算は頂点シェーダーで行われます。

私のテストでは、2 つの VBO を 1 つにマージすると、位置の更新数がテクスチャ/色の更新数とあまり変わらない場合にパフォーマンスが向上しました。これは、頂点が 32 バイトでアラインされているためだと思います。しかし、私のアプリケーション (そしてほとんどの人のものだと思います) では、位置はほとんどのフレームで更新されますが、他のものは決して更新されず、グラフィックス カードにプッシュするバッファが小さい方が勝っているように見えました。

于 2012-07-17T11:55:58.783 に答える
2

多数の粒子を扱った経験から、オプション (2.) を使用します。たぶん、オフセット/方向のインデックスをデータにパックできますか (たとえば、これまで使用していない場合は、位置ベクトルの w コンポーネントとして)? 0 = (-1,-1); 1 = (-1,1); 2 = (1,1); 3 = (1,-1)。

(イアンが提案したように、コメントを回答にコピーしました!)

@Ian:私があなたを正しく理解しているなら、あなたはグローバルな不透明度/アルファを持っていると言ったので、そのためにuniformを使用し、 の w-component を使用できるはずvec4 colorですflag。しかし、これで何かが変わるとは思えません…。

ところで、あなたが既に述べたジオメトリ シェーダー ソリューションは、より洗練されているだけでなく、少し高速でもあるはずです。

于 2012-07-18T11:49:08.237 に答える
1

帯域幅の改善はほとんど見られませんでした。gl_VertexID % 4各スプライトに4つの頂点(6つのインデックス)があると仮定すると、の代わりに単純に使用できますflags

頂点ごとの属性:

  • vec2 float position、、float orientation-float scaleスプライトジオメトリデータ(16B)
  • uint flags-特別なスプライトのオプションのフラグ(4B)
  • float param-スムーズなスプライト変換用のオプションのパラメータ(4B)

ユニフォーム:

  • vec2 vertexPosition[4]-各コーナーの相対位置-中心を指定するために使用できます
  • vec2 textureCoord[4]-各コーナーのテクスチャ座標。フラグを介して定義できるスプライト状態に4*ntexcoordを使用することもできます。n

この設定では、単純なスプライトの場合、頂点ごとに16Bしか使用しません。

于 2013-02-04T19:35:52.437 に答える