与PBO异步glReadPixels

时间:2012-07-10 08:47:56

标签: opengl glreadpixels pbo

我想用两个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方式更快,但不是令人满意的立即返回

我的问题是:

  • 影响glReadPixels表现的因素是什么?有些时候,它的成本达到10毫秒,但这里只有1.3毫秒。
  • 为什么立即返回的费用高达1.2毫秒?是太大还是正常?

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

根据与演示的比较,我发现了两个因素:

  • GL_BGRA优于GL_RGBA,1.3ms => 1.0ms(无PBO),1.2ms => 0.9ms(使用pbo)
  • glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA)而不是GLUT_RGBA,0.9ms =&gt; 0.01ms。这就是我想要的性能。在我的系统中,GLUT_RGBA = GLUT_RGB = 0。 GLUT_ALPHA = 8

然后另外两个问题:

  • 为什么GL_BGRA优于GL_RGBA?是针对特定平台还是针对所有平台?
  • 为什么GLUT_ALPHA如此重要以至于它会极大地影响PBO的表现?

2 个答案:

答案 0 :(得分:5)

我不清楚glutInitDisplayMode,但这通常是因为您的内部和外部格式不匹配。例如,当组件数量不匹配时,您将不会注意到异步行为,因为此转换仍会阻止glReadPixels

因此,最有可能的问题是,使用glutInitDisplay(GLUT_RGBA),您实际上会创建一个默认的帧缓冲区,其内部格式实际为RGB甚至BGR。传递GLUT_ALPHA参数可能会在内部使其RGBABGRA,这与您想要的组件数量相匹配。

编辑:我发现nvidia document解释了有关像素打包和性能影响的一些问题。

edit2:BGRA的性能提升很可能是因为内部hw缓冲区位于BGRA,但实际上并没有更多。

答案 1 :(得分:2)

BGRA是最快的,因为这是现代GPU上的原生格式。 RGBA,RGB和BGR需要在回读期间“重新格式化”。