OpenGLで一回の描画呼び出しで幾何学的に分割されたジオメトリをレンダリングする良いアプローチを構想しています。私が反対している壁は、各ピースが異なる平行移動と回転単一のオブジェクト描画間でモデルビューを一様に更新するという贅沢さがないからです。私はここや他のいくつかの他の質問を読んできました、そして、人々が指摘されている指示がかなり異なっているようです。これを行う主な方法を列挙し、最も一般的で推奨されているものを分離しようとするとよいでしょう。ここで私が考えられてきたアイデアです:異なる変換を持つバッチ描画オブジェクトのベストプラクティスは何ですか?
[編集:インスタンス化の削除言及それは本当にここには適用されないよう]
シェーダで行列変換を作成します。ここでは、アトリビュートの一部として、平行移動ベクトルまたは回転角または四元数を送信します。利点は、モバイルを含むクロスプラットフォームで動作することです。しかし、オブジェクト内のすべての単一の頂点に対して正確に同じ変換データを属性として送信するのは少し浪費しているようです。インスタンス化せずに、私は、インターリーブ配列の一部として、VBOで何度も何度も、単一のオブジェクトに対してこれらの同一のベクトルまたはスカラーを繰り返す必要があります。もう一つの欠点は、私はシェイダーに依頼して数学をすることです。これが賢明であるかどうかはわかりません。
1)と同様ですが、シェーダを使用して行列計算を行うのではなく、クライアント側でこれを行いますが、VBOで16個の浮動小数点数のストリームとして最後のモデルビュー行列を送信します。しかし、私が知る限りでは、インスタンス化することなく、VBOの各頂点ごとに同じストリームを繰り返す必要があります。ちょうど無駄に思える。上記の2)とのトレードオフは、VBOの頂点でより多くのデータを送信していることです(変換のために3フロートのベクトルではなく16浮動小数点、おそらく4浮動四元数)。
上記の制限をすべて省略して、オブジェクトごとに個別の描画呼び出しで妥協してください。これは、私が読んでいる本の中で典型的に「教えられている」ものです。間違いなく簡単です。
他の一般的な方法はありますか?
学問的な質問として、上記のすべてが実現可能で「許容可能」であるか、またはいずれかが他のものよりも明らかに勝っている場合、私は不思議です。デスクトップGLを排他的に使用する場合、これを達成するための主要な方法を導入していますか?
良い質問ですが、これらのさまざまなテクニックのさまざまな賛否両論についての議論が大好きです。 –
このような多種多様なハードウェアプラットフォームで合理的または正確な推奨事項を提供するには、これはハードウェアにはあまりにも厳しいものです。インスタンシングを使用するのが適切な時期についての議論だけでも、ハードウェア固有のものです。基本的に1ヶ月のプロファイリング研究プロジェクトについて話しています。 –
@NicolBolas大丈夫です...インスタンス化に関する議論を省略したとしましょう。あなたは、他のテクニックについての議論に意味がないと言っていますか?人々はVBOやシェーダでさまざまなことを試していますが、何を知っておくべきか、なぜこれらの提案のいくつかがどうして良いのかなどといった一般的な考えがあります。 – johnbakers