私は、OpenGL で 1 回の描画呼び出しを使用して、バラバラなジオメトリの断片をできるだけ多くレンダリングするための優れたアプローチを概念化しています。私が直面している壁は、各断片が異なる移動とおそらく回転を持っている場合にそうするための最良の方法です。単一のオブジェクトの描画間でモデル ビューを均一に更新する余裕はありません。ここや他の場所でいくつかの他の質問を読みましたが、人々が指し示している方向は非常に多様であるようです. これを行うための主な方法をリストし、最も一般的または推奨される方法を特定することをお勧めします。私が考えたアイデアは次のとおりです。
[編集: ここでは実際には適用されないため、インスタンス化に関する言及を削除しました]
シェーダーでマトリックス変換を作成します。ここでは、アトリビュートの一部として、平行移動ベクトル、または回転角度またはクォータニオンを送信します。利点は、モバイルを含むクロスプラットフォームで機能することです. しかし、オブジェクトの頂点ごとにまったく同じ変換データを属性として送信するのは少し無駄に思えます。インスタンス化を行わないと、インターリーブ配列の一部として、VBO 内で 1 つのオブジェクトに対してこれらの同一のベクトルまたはスカラーを何度も繰り返さなければなりませんよね? もう 1 つの欠点は、計算を行うためにシェーダーに依存していることです。これが賢明かどうかはわかりません。
1) と同様ですが、行列の計算を行うためにシェーダーに依存する代わりに、これらをクライアント側で行いますが、VBO で 16 個の float のストリームとして最終的なモデル ビューの行列を送信します。しかし、私が知る限り、インスタンス化せずに、VBO のすべての頂点に対してこの同一のストリームを繰り返さなければなりませんよね? ただ無駄に思えます。上記の 2) とのトレードオフは、頂点ごとに VBO でより多くのデータを送信することです (変換用の 3 フロート ベクトルではなく 16 フロート、おそらく 4 フロート クォータニオン) が、シェーダーに必要な作業は少なくなります。
上記のすべての制限をスキップし、代わりにオブジェクトごとに個別の描画呼び出しで妥協します。これは、私が読んでいる本で典型的に「教えられている」ことです。
これら以外の一般的な方法はありますか?
学術的な質問として、上記のすべてが実行可能で「受け入れられる」かどうか、またはそのうちの1つが他のものよりも明らかに勝者であるかどうかに興味がありますか? デスクトップ GL のみを使用する場合、これを実現するための主な方法はインスタンス化ですか?