6

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とグラフィックスレンダリングにかなり慣れていないので、複数のオブジェクトをレンダリングするために必要な情報を処理するための最適な方法を完全に理解しようとしています。

4

1 に答える 1

3
  • 特定のオブジェクトの位置/回転に変換します

これは、4x4行列を一様変数にロードすることを意味します。

フレームの更新ごとにこのような変換を処理すると、パフォーマンスに大きな影響がありますか?

変換は、頂点シェーダーで、前述の行列と頂点座標を乗算することにより、多くの頂点に対して並列に実行されます。

誰かが言及していた別の方法は、単一のVBO内のすべての頂点のすべての位置データを貼り付けてから、1回の呼び出しでレンダリングすることでした。このメソッドでは、オブジェクトを「作成」することを想定しています。各頂点の位置データを、そのローカル座標を(静的配列を介して)取得し、その特定のオブジェクトの位置データを頂点に追加する関数を介して処理する必要があります。 VBOに保存しますか?その場合、回転もどのように処理しますか?

すべてのフレームで(または少なくともオブジェクトの位置/方向が変化するときに)データをアップロードする必要があるため、これはあまり良い考えではないようです。

3番目の方法は最初の方法と同じように見えますが、OGL3 +の用語でのみですが、最初の方法はOGL2.xの用語のように見えます:)

最後に、すべてのオブジェクトにVBOを設定し、すべてのインスタンスにdrawarrayを呼び出すことを提案する人がいます。

おそらくあなたは誤解していて、VBOではなくVAOを意味していましたか?VAOを使用して、頂点属性(VBO単位)をアップロードし、VAOをバインドし、各VBOを適切な属性の場所にバインドし、これを最初に1回だけ実行します。各フレームで、次のことを行います。

// Bind the VAO
glBindVertexArray(vao)

// Draw the object
glDrawArrays/glDrawArraysInstanced/etc.

// CLear VAO binding
glBindVertexArray(0)

同じVBO内の多くの異なるオブジェクトの頂点属性を引き続き持つことができることに注意してください。glDrawArrays他のオブジェクトには、配列のどこから描画を開始するかを決定するパラメータがあります。

于 2012-11-22T08:20:38.030 に答える