我想使用两个 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 性能的因素是什么?有时,它的成本达到 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。过剩阿尔法=8
然后还有两个问题:
- 为什么 GL_BGRA 比 GL_RGBA 好?是只针对特定平台还是针对所有平台?
- 为什么 GLUT_ALPHA 如此重要以至于它会极大地影响 PBO 的性能?