3

OpenGLでパフォーマンスの問題が発生しています。私は基本的に正方形のグリッドを作成したいと思います。最初に、各正方形を必要な場所に変換する場所に実装しようとしました。次に、モデルとビューマトリックスを乗算し、シェーダープログラムに渡して、正方形を描画します。私は各正方形に対してこれを行います。約50の正方形を作成した後、フレームレートは私が望むものよりも低くなり始めます。

次に、正方形が位置を変更するたびに基本的に頂点バッファーを生成するVBOメソッドを試しました。このアプローチではフレームレートが劇的に向上しましたが、すべての頂点位置を再生成する必要があるため、何かが変更されたときにレイテンシが長すぎます。

必要だと思うのはマトリックススタックです...以前はopengl1.1を使用していて、push/popを使用していました。それが何をしていたのか、そしてそれをどのように再現するのかという概念を私は本当に理解していません。マトリックススタックの良い例が、例として使用できる場所を知っている人はいますか?それとも、1つの良い説明ですか?

4

1 に答える 1

2

あなたはこのチュートリアルをチェックすることができます、基本的にあなたが達成したいのと同じことをしていますが、正方形の代わりに立方体を使っています。VBOも使用します。

http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/

マトリックスについては、OpenGL ES 2.0では、マトリックス関連の関数はもうありませんが、同じ(およびはるかに)機能するglmathライブラリを使用できます。

http://glm.g-truc.net/

これはヘッダーライブラリなので、どこかにコピーして、必要な場所に含めるだけです。

あなたの目的を完全に理解しているかどうかはわかりませんが、(VBOを使用して)1つの正方形のデータをグラフィックカードにコピーしてから、すべての正方形のモデル行列を繰り返し更新できると思います。

マトリックススタックの概念は、正方形の間に何らかの階層がある場合に意味があります(たとえば、正方形の1つが移動した場合、左側の正方形もそれに応じて移動する必要があります)。

あなたはそれを正方形で作られた骸骨として想像することができます。肩が動くと、腕のすべての部分(手、指など)も動きます。マトリックススタックを使用して、これをエミュレートできます。すべての正方形である種のツリーを作成して、すべての正方形に「子孫」のリストを作成できます。これにより、親と同じ変換が適用されます。次に、次のようにすべての正方形を再帰的にレンダリングできます。

  1. ルートスクエアに変換を適用します
  2. 変換をキューにプッシュします
  3. すべての子に対して同じレンダリング関数を呼び出します
  4. すべての子は、キューの一番上にあるマトリックスを読み取り、それを独自の変換で乗算し、新しいマトリックスをキューにプッシュして、子を呼び出します
  5. その後、すべての子が前にプッシュしたマトリックスをポップアウトします

glmathの使用は非常に簡単で、行列のキュー(この場合はstd:vector)を作成する必要があります。

std::vector<glm::mat4> matrixStack;

そして、すべての子供のために:

glm::mat4 modelMatrix = matrixStack.back();
glm::mat4 nodeTransform = /*apply your transform here*/
glm::mat4 new = modelMatrix * nodeTransform;
matrixStack.push_back(new);
/*Pass in the new matrix to the shader and call to glDrawArrays or whatever to render your square*/

for (every child) {
    render();
}
matrixStack.pop_back();

描画部分については、glDrawArraysを呼び出す前に、頂点配列を正方形の頂点にバインドし、すべての子のシェーダーでモデル行列を更新できると思います。

于 2013-01-15T16:38:03.323 に答える