別の方法でピクセルを読み取るために、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 のパフォーマンスに大きく影響するほど重要なのはなぜですか?