【问题标题】:Asynchronous glReadPixels with PBO带 PBO 的异步 glReadPixels
【发布时间】:2012-07-09 17:10:42
【问题描述】:

我想使用两个 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 毫秒?是太大还是正常?

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

根据一个demo对比,我发现了两个因素:

  • 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

还有两个问题:

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

【问题讨论】:

  • ooo 刚刚自己在我的系统上测试了这个 GLUT_RGBA 330 fps GLUT_RGB|GLUT_ALPHA 630fps 增加了 2 倍错过了 GLUT_ALPHA 的重要性。
  • 对于 macOS 上的我来说,我必须确保我的缓冲区大小是 2 的幂!否则带有 PBO 的 glReadPixels 会阻塞

标签: opengl glreadpixels pbo


【解决方案1】:

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

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

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

edit2:BGRA 的性能提升可能是因为内部硬件缓冲区位于 BGRA 中,实际上并没有更多的东西。

【讨论】:

  • 如果你读的是 DEPTH_COMPONENT 而不是 RGBA,你能得到异步 glReadPixels() 吗?因为我在使用 PBO 时无法立即返回 glReadPixels。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 2019-09-23
    • 1970-01-01
    • 2017-04-15
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多