OpenGLで複数のオブジェクトを処理/レンダリングする方法を理解するのに少し苦労しています。私は周りを見回して、グーグルとOpenGLの赤い本で、私が理解しようとしていることの周りでダンスのような答えを見つけましたが、私は正しい考えを持っているかどうかを確認する必要があります。
私が最初に考えたのは、X、Y、Zのそれぞれの平行移動変数と回転変数を使用して位置データを処理する必要があるということでした。そのクラスの静的VBOに単一のメッシュを格納し、レンダリングするインスタンスごとにfor-nextループを実行します。
- IDをロードします
- 特定のオブジェクトの位置/回転に変換します
- drawarraysを使用して、その場所でメッシュをレンダリングします
- 次のオブジェクトにループし、すべてのオブジェクトに対して上記を繰り返します
フレームの更新ごとにこのような変換を処理すると、パフォーマンスに大きな影響がありますか?
誰かが言及していた別の方法は、単一のVBO内のすべての頂点のすべての位置データを貼り付けてから、1回の呼び出しでレンダリングすることでした。このメソッドでは、オブジェクトを「作成」することを想定しています。各頂点の位置データを、そのローカル座標を(静的配列を介して)取得し、その特定のオブジェクトの位置データを頂点に追加する関数を介して処理する必要があります。 VBOに保存しますか?その場合、回転もどのように処理しますか?
私が持っていた3番目の考えは、平行移動/回転情報を保持するオブジェクトのすべてのインスタンスに4x4マトリックスを格納することでした。次に、レンダリングに行くときに、そのオブジェクトのマトリックスをロードし、単一のVBOからメッシュを描画します。次のオブジェクトのマトリックスをロードしたり、同じVBOから描画したりします。
最後に、すべてのオブジェクトにVBOを設定し、すべてのインスタンスにdrawarrayを呼び出すことを提案する人がいます。この方法は私には非常に非効率的であるように思われ、すべてのメッシュに対してVBOを呼び出す場合、VBOを持つことのポイントは何であるか疑問に思います。すべてのオブジェクトに対してVBOを作成してバインドするオーバーヘッドがないという理由だけで、即時モード(減価償却されていることを理解しています)の方が高速であるように思われます。
複数のオブジェクトを処理/レンダリングするこれらの方法のいずれか/すべてが有効ですか?もしそうなら、それぞれの方法の長所と短所は何ですか?
最も理にかなっている方法は、メッシュごとに1つのVBOを持ち、更新ごとにそれらを変換するか、更新ごとに各オブジェクトのマトリックスをロードしてそのようにレンダリングする方法です。私はOpenGLとグラフィックスレンダリングにかなり慣れていないので、複数のオブジェクトをレンダリングするために必要な情報を処理するための最適な方法を完全に理解しようとしています。