15

GL_QUADSはOpenGL3.1以降から削除されたので、それを使用せずに多くのクワッドを描画する最も速い方法は何ですか?私はいくつかの異なる方法(以下)を試し、私のマシンの速度でそれらをランク付けしましたが、最速の方法はまだ無駄でエレガントではないように見えるので、もっと良い方法があるかどうか疑問に思いました。これらの各方法では、頂点とテクスチャの座標がインターリーブされたVBOを使用していることに注意してください。これは、ベストプラクティスであると信じているためです(間違っている場合もあります)。また、テクスチャ座標が異なるため、別々のクワッド間で頂点を再利用することはできません。

  1. プリミティブ再起動インデックスを使用するGL_TRIANGLE_STRIPを持つglDrawElements。これにより、インデックス配列は{0、1、2、3、PRI、4、5、6、7、PRI、...}のようになります。これにより、VBOの最初の4つの頂点が取り込まれ、それらが三角形のストリップとして扱われて長方形が作成され、次の4つの頂点が別のストリップとして扱われます。ここでの問題は、インデックス配列がスペースの浪費のように見えることです。以前のバージョンのOpenGLのGL_QUADSの良いところは、4つの頂点ごとにプリミティブを自動的に再起動することです。それでも、これは私が見つけることができる最速の方法です。

  2. ジオメトリシェーダー。長方形ごとに1つの頂点を渡し、シェーダーで4つの頂点の適切な三角ストリップを作成します。これは最も高速でエレガントなようですが、冗長データを渡す場合に比べて、ジオメトリシェーダーはそれほど効率的ではないことを読みました。

  3. GL_TRIANGLESを使用したglDrawArrays。頂点を再利用せずに、すべての三角形を個別に描画します。

  4. glMultiDrawArraysとGL_TRIANGLE_STRIP、「最初の」配列の場合は4のすべての倍数の配列、「count」配列の場合は4の束の配列。これは、ビデオカードに0から始まる最初の4を描画し、次に4から開始する最初の4を描画するように指示します。これが非常に遅い理由は、これらのインデックス配列をVBOに配置できないためだと思います。

4

1 に答える 1

5

あなたはすべての典型的な良い方法をカバーしましたが、私がより高いパフォーマンスを持っているかもしれないと私が思ういくつかのあまり典型的でない方法を提案したいと思います。質問の言い回しに基づいて、タイルのm * n配列を描画しようとしていると仮定します。これらはすべて、異なるテクスチャ座標を必要とします。

  • ジオメトリシェーダーは、頂点を追加および削除するための適切なツールではありません。これは可能ですが、実際に動的にレンダリングするプリミティブの数を変更する場合(シャドウボリュームの生成など)を対象としています。異なるテクスチャ座標で隣接する異なるプリミティブの全体を描画したいだけの場合、絶対に最速の方法はテッセレーションシェーダーを使用することだと思います。単一のクワッドを渡すだけで、テッセレータにテクスチャ座標を手続き的に計算させることができます。
  • 同様のより移植性の高い方法は、各クワッドのテクスチャ座標を検索することです。これは簡単です。50x20のクワッドを描画しているとすると、すべてのテクスチャ座標を格納する50x20のテクスチャが作成されます。頂点プログラムで(またはジオメトリプログラムでより効率的に)このテクスチャをタップし、実際のレンダリングのために結果をフラグメントプログラムに変化させて送信します。

上記の両方の場合で、頂点を再利用できることに注意してください。最初の方法では、中間頂点がオンザフライで生成されます。2番目の例では、頂点のテクスチャ座標がシェーダーでテクスチャからキャッシュされた値に置き換えられます。

于 2012-10-20T03:30:11.267 に答える