Mar*_*ang 8 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;
Run Code Online (Sandbox Code Playgroud)
结果是
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
Run Code Online (Sandbox Code Playgroud)
PBO的方式有点快,但不是令人满意的立即回报.
我的问题是:
================================================== =========================
根据与演示的比较,我发现了两个因素:
然后另外两个问题:
我不知道glutInitDisplayMode,但这通常是因为您的内部和外部格式不匹配.例如,当组件数量不匹配时,您将不会注意到异步行为,因为此转换仍会阻止glReadPixels.
因此,最可能的问题是,glutInitDisplay(GLUT_RGBA)您实际上会创建一个默认的帧缓冲区,其内部格式实际上RGB甚至是BGR.传递GLUT_ALPHA参数很可能使其RGBA或BGRA内部,要组件的数量相匹配.
编辑:我发现了一个nvidia文档,解释了有关像素打包和性能影响的一些问题.
edit2:性能增益BGRA可能是因为内部hw缓冲区已经存在BGRA,实际上还没有更多.
| 归档时间: |
|
| 查看次数: |
4914 次 |
| 最近记录: |