2013-04-21 13 views
16

OpenGLで一回の描画呼び出しで幾何学的に分割されたジオメトリをレンダリングする良いアプローチを構想しています。私が反対している壁は、各ピースが異なる平行移動と回転単一のオブジェクト描画間でモデルビューを一様に更新するという贅沢さがないからです。私はここや他のいくつかの他の質問を読んできました、そして、人々が指摘されている指示がかなり異なっているようです。これを行う主な方法を列挙し、最も一般的で推奨されているものを分離しようとするとよいでしょう。ここで私が考えられてきたアイデアです:異なる変換を持つバッチ描画オブジェクトのベストプラクティスは何ですか?

[編集:インスタンス化の削除言及それは本当にここには適用されないよう]

  1. シェーダで行列変換を作成します。ここでは、アトリビュートの一部として、平行移動ベクトルまたは回転角または四元数を送信します。利点は、モバイルを含むクロスプラットフォームで動作することです。しかし、オブジェクト内のすべての単一の頂点に対して正確に同じ変換データを属性として送信するのは少し浪費しているようです。インスタンス化せずに、私は、インターリーブ配列の一部として、VBOで何度も何度も、単一のオブジェクトに対してこれらの同一のベクトルまたはスカラーを繰り返す必要があります。もう一つの欠点は、私はシェイダーに依頼して数学をすることです。これが賢明であるかどうかはわかりません。

  2. 1)と同様ですが、シェーダを使用して行列計算を行うのではなく、クライアント側でこれを行いますが、VBOで16個の浮動小数点数のストリームとして最後のモデルビュー行列を送信します。しかし、私が知る限りでは、インスタンス化することなく、VBOの各頂点ごとに同じストリームを繰り返す必要があります。ちょうど無駄に思える。上記の2)とのトレードオフは、VBOの頂点でより多くのデータを送信していることです(変換のために3フロートのベクトルではなく16浮動小数点、おそらく4浮動四元数)。

  3. 上記の制限をすべて省略して、オブジェクトごとに個別の描画呼び出しで妥協してください。これは、私が読んでいる本の中で典型的に「教えられている」ものです。間違いなく簡単です。

他の一般的な方法はありますか?

学問的な質問として、上記のすべてが実現可能で「許容可能」であるか、またはいずれかが他のものよりも明らかに勝っている場合、私は不思議です。デスクトップGLを排他的に使用する場合、これを達成するための主要な方法を導入していますか?

+3

良い質問ですが、これらのさまざまなテクニックのさまざまな賛否両論についての議論が大好きです。 –

+1

このような多種多様なハードウェアプラットフォームで合理的または正確な推奨事項を提供するには、これはハードウェアにはあまりにも厳しいものです。インスタンシングを使用するのが適切な時期についての議論だけでも、ハードウェア固有のものです。基本的に1ヶ月のプロファイリング研究プロジェクトについて話しています。 –

+3

@NicolBolas大丈夫です...インスタンス化に関する議論を省略したとしましょう。あなたは、他のテクニックについての議論に意味がないと言っていますか?人々はVBOやシェーダでさまざまなことを試していますが、何を知っておくべきか、なぜこれらの提案のいくつかがどうして良いのかなどといった一般的な考えがあります。 – johnbakers

答えて

11

二つの考慮事項:

複数のオブジェクトを持っている場合、一般的には、複数の描画呼び出しを使用し、独立したトランスフォームを使用して各オブジェクト と、話します。それは彼らのためにそこにある です。古いNVIDIAの「バッチバッチバッチ」プレゼンテーション は、1GHz GPUのフレームあたり10,000〜40,000のドローコール(D3D、More in GL)を引用しています。今日、あなたはそれよりもむしろ見ています。 あなたが数万の個々のオブジェクトを扱っていない限り、 はすべて異なっているので(インスタンス化しない)、オッズは良いです。 あなたは大丈夫でしょう。

もう一つのアイデア:

は完全にシェーダのうち、モデルビュー行列の計算を取り、ちょうど乗算後の頂点を通過します。これにより、さまざまな向きと平行移動で多くのオブジェクトを1回呼び出すことができます。コストはすべてのCPU計算で求められますが、ボトルネックが複数の描画呼び出しのボトルネックほど大きくない場合は、その価値があります。

(。hereからの引用)

5

ここで代替アイデアです:

は、属性を経由して渡されるオブジェクトID頂点それぞれを与えます。次に、頂点シェーダでこのIDを使用して、変換行列を格納するテクスチャでルックアップを実行します。

+0

ああ、テクスチャの検索。あなたは賭ける、私はそれが好きです。ありがとう。 – johnbakers

+0

私はこのアプローチでプレイしました。それはスプライトのようなものです。もちろん、毎回テクスチャをプッシュする必要がありますが、それはほんの一握りで、頂点よりはるかに小さいものです。 私の単純化したケースでは、xyz-translationとy-rotationのためにvec4sを1行で使用しました。テクスチャ内の完全なマトリックスは必ずしも必要ではないかもしれません。 –

関連する問題