我想使用两个 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方式稍微快一点,但不是令人满意的立即返回 。
我的问题是:
================================================== ==========================
通过和一个demo对比,我发现了两个因素:
然后还有两个问题:
最佳答案
不知道glutInitDisplayMode
记住,但这通常是因为您的内部和外部格式不匹配。例如,当组件数量不匹配时,您不会注意到异步行为,因为此转换仍会阻止 glReadPixels
.
所以最有可能的问题是 glutInitDisplay(GLUT_RGBA)
您实际上将创建一个默认帧缓冲区,其内部格式实际上是 RGB
甚至 BGR
.路过 GLUT_ALPHA
参数很可能使它RGBA
或 BGRA
在内部,它与您想要的组件数量相匹配。
编辑:我发现了一个 nvidia document解释有关像素打包和性能影响的一些问题。
edit2:BGRA
的性能提升可能是因为内部硬件缓冲区在 BGRA
,没有更多了。
关于opengl - 带有 PBO 的异步 glReadPixels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409693/