2

ペイントアプリを持っています。マウスイベントの座標はVertexArrayに保存されます。次に、頂点配列が画面に描画されます。私のコード構造は次のようになります

// I get mouse event coordinates and store them to VertexArray
glPushMatrix();
//some new matrix settings
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
glClear(GL_COLOR_BUFFER_BIT);
//now I draw first full size textured quad and later I draw vertexArray

glDrawArrays(.....);

//and now I draw second full size textured quad on top of first quad ant that what have been drawn from vertex array

glPopMatrix();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


//immediately after that I draw FBO to screen:
glBindTexture(GL_TEXTURE_2D, fbTexture);
//Code for drawing textured quad
glBindTexture(GL_TEXTURE_2D, 0);

そのため、新しいマウスイベント座標が登録されるたびにすべてが再描画されます。また、座標が1000を超えると、描画が非常に遅くなります。私の問題はどこにありますか?OpenGLの1000個の頂点はそれほど多くありません

4

1 に答える 1

3

頂点の数ではありません。それはあなたがそれらを送る方法です。

まず、「本当に遅い」と定義したことはありません。多くの場合、400fps から 300fps への変更は「遅い」と誤解されます。そうではありません。これは、フレームあたり 2.5 ミリ秒から 3.3 ミリ秒へのレンダリング時間の増加のみを表しており、1 ミリ秒未満の変化です。些細なことではありませんが、おそらくあまり気にする必要はありません。

FPS ではなく、レンダリング時間の観点からパフォーマンスを測定することは常に重要です。

そうは言っても、あなたの主な問題は、一度に 1 つのクワッドを描画していることです。それぞれが別のglDrawArraysコマンドから来ています。これは必ずしも良いことではありません。特に、描画コマンド間で状態を変更する場合 (テクスチャのバインドなど) は特にそうです。

もしそうしているなら、それを避ける方法を見つける必要があります。あなたがやりたいことは、すべて 1 つのドローコールで多くのクワッドをレンダリングすることです。これは、それらすべてに同じテクスチャを使用する必要があることを意味します。

この問題の一般的な解決策は、異なる場所に複数の画像を持つ大きなテクスチャを作成することです。これは一般に「テクスチャ アトラス」と呼ばれます (詳細については Google を参照してください)。各クワッドには、レンダリングする特定の画像のテクスチャ座標があります。テキストは、多くの場合、各文字 (グリフ) が同じテクスチャに格納されるような方法で描画されます。

于 2012-08-20T12:32:05.353 に答える