8

別の方法でピクセルを読み取るために、2 つの PBO を使用したいと考えています。PBOを使用するとglReadPixelsがすぐに戻り、多くの時間が重複する可能性があるため、PBOの方がはるかに高速になると思いました。

意外とメリットは少ないようです。次のようなコードを検討してください。

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    Timer t; t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " ";

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl;

結果は

1.301 1.185
1.294 1.19
1.28 1.191
1.341 1.254
1.327 1.201
1.304 1.19
1.352 1.235

PBO の方法は少し高速ですが、満足のいく即時返品ではありません。</p>

私の質問は:

  • glReadPixels のパフォーマンスに影響を与える要因は何ですか? 場合によっては、10ms に達することもありますが、ここでは 1.3ms です。
  • 即時リターンのコストが 1.2 ミリ秒もかかるのはなぜですか? 大きすぎますか、それとも普通ですか?

================================================== =========================

デモとの比較によると、2 つの要因が見つかりました。

  • GL_BGRA は GL_RGBA よりも優れており、1.3ms=>1.0ms(PBO なし)、1.2ms=>0.9ms(pbo あり)
  • glutInitDisplayMode(GLUT_RGB|GLUT_ALPHA) ではなく、GLUT_RGBA, 0.9ms=>0.01ms。それが私が望むパフォーマンスです。私のシステムでは、GLUT_RGBA=GLUT_RGB=0 です。GLUT_ALPHA=8

次に、別の 2 つの質問:

  • GL_BGRA が GL_RGBA より優れているのはなぜですか? 特定のプラットフォームだけに当てはまるのか、それともすべてのプラットフォームに当てはまるのか?
  • GLUT_ALPHA が PBO のパフォーマンスに大きく影響するほど重要なのはなぜですか?
4

2 に答える 2

5

はっきりとはわかりませんglutInitDisplayModeが、これは通常、内部フォーマットと外部フォーマットが一致していないことが原因です。たとえば、コンポーネントの数が一致しない場合でも、この変換によってglReadPixels.

したがって、最も可能性の高い問題は、実際にまたは偶数glutInitDisplay(GLUT_RGBA)の内部フォーマットでデフォルトのフレームバッファを実際に作成することです。パラメータを渡すと、必要なコンポーネントの数と一致するか、内部的に作成される可能性があります。RGBBGRGLUT_ALPHARGBABGRA

編集:ピクセル パッキングとパフォーマンスへの影響に関するいくつかの問題を説明しているnvidia ドキュメントを見つけました。

edit2: のパフォーマンスの向上BGRAは、内部ハードウェア バッファーが にあるためである可能性が高く、BGRAそれ以上のことはありません。

于 2012-07-10T13:18:51.717 に答える
2

BGRA は最新の GPU のネイティブ フォーマットであるため、最速です。RGBA、RGB、および BGR は、リードバック中に「再フォーマット」する必要があります。

于 2012-07-10T13:17:42.590 に答える